/dev/adei/kitcube-status

To get this branch, use:
bzr branch http://darksoft.org/webbzr/dev/adei/kitcube-status

« back to all changes in this revision

Viewing changes to scripts/hatpro_contour.cgi

  • Committer: Chuan Miao
  • Date: 2014-03-24 08:44:49 UTC
  • Revision ID: chuan.miao@kit.edu-20140324084449-jwqklxh2x2zx4i3n
hatpro.py

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#!/usr/bin/env python
 
2
import os
 
3
import sys
 
4
import cgi, cgitb
2
5
import numpy as np
3
6
import simplejson as json
4
 
import ConfigParser
5
 
import re
6
 
import sys
7
 
import cgi, cgitb
8
 
import adeitools as adei
9
7
import matplotlib as mpl
10
8
import matplotlib.cm as cm
 
9
import adeitools as adei
 
10
import hatpro
 
11
from hatpro import parseConfig, device_
11
12
 
12
13
mpl.use('Agg')
13
14
import matplotlib.pyplot as plt
14
15
 
15
 
c1 = re.compile('^sensor\d+')
16
 
c2 = re.compile('^server')
17
 
 
18
 
config = ConfigParser.ConfigParser()
19
 
config.read("../hatpro.ini")
20
 
sensors = [dict(config._sections[a]) for a in config.sections() if c1.match(a)]
21
 
 
22
 
config = ConfigParser.ConfigParser()
23
 
config.read("../server.ini")
24
 
servers = [dict(config._sections[a]) for a in config.sections() if c2.match(a)]
25
 
 
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)) }
30
 
for s in adeiservers:
31
 
    adeiservers[s].updateSensor('name', 'column')
32
 
 
33
 
# select sensor
34
 
for sensor in sensors:
35
 
    if sensor['method'] != 'hatpro_contour':
36
 
        continue
37
 
 
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']]
43
 
 
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
49
 
    newstamp = t0
50
 
    daystamp = t00
51
 
    print "time stamps (new/day):    %s/%s" % (newstamp, daystamp)
52
 
 
53
 
    sensorList = srv.sensorFilter(sensor['sensor'])
54
 
    colormap = cm.GnBu
55
 
 
56
 
    for timekey in ['0d', '1d', '2d']:
57
 
        filename = "../cache/%s.%s.%s.json" % (sensor['device'], sensor['sensor'], timekey)
58
 
 
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')
63
 
        try:
64
 
            with open(filename, 'r') as f:
65
 
                oldstamp = json.loads(f.read())[0]['stamp']
66
 
        except:
67
 
            oldstamp = 0
68
 
        update_level = 0
69
 
        if oldstamp < newstamp: update_level += 1 
70
 
        if oldstamp < daystamp: update_level += 1 
71
 
        print "outfile (update level):   %s (%s)" % (filename,update_level)
72
 
 
73
 
        # get data
74
 
        dt = 86400
75
 
        data = None
76
 
 
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 ]
86
 
 
87
 
        if data:
88
 
            # contour
89
 
            ys = range(len(data))
90
 
            cs = plt.contourf(time, ys, data, 50, cmap=colormap)
91
 
 
92
 
            # output
93
 
            pathList = []
94
 
            pathList.append({"xmin": time[0], "xmax": time[-1], "ymin": ys[0], "ymax": ys[-1], "stamp": newstamp})
95
 
 
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():
99
 
                    pp = []
100
 
                    for vertex, code in zip(path.vertices, path.codes):
101
 
                        if len(pp) != 0 and code == 1:
102
 
                            pp.append(None)
103
 
                            pp.append(vertex.tolist())
104
 
                        else:
105
 
                            pp.append(vertex.tolist())
106
 
 
107
 
                    pathList.append({"layer": l, "path": pp, "color": color})
108
 
 
109
 
            try:
110
 
                with  open(filename, "w") as f:
111
 
                    json.dump(pathList, f)
112
 
            except:
113
 
                pass
 
16
class adeiReader(hatpro.adeiReader):
 
17
    def getData(self, sensorName, groupName, t0, dt):
 
18
        sensorList = self.sensorFilter(sensorName, groupName)
 
19
 
 
20
        colormap = cm.GnBu
 
21
 
 
22
        time = self.getSensorTime(sensorList[0], groupName, t0, dt)
 
23
        data = [ self.getSensorData(i, groupName, t0, dt) 
 
24
                for i in sensorList ]
 
25
        heights =  [int(self.groups[groupName]['sensors'][i]['axis2_value'])
 
26
                for i in sensorList]
 
27
        contours = plt.contourf(time, heights, data, 50, cmap=colormap)
 
28
 
 
29
        Paths = []
 
30
        for l, p, c in zip(
 
31
                contours.layers, 
 
32
                contours.collections, 
 
33
                contours.tcolors):
 
34
            color = mpl.colors.rgb2hex(c[0][:3])
 
35
            for path in p.get_paths():
 
36
                pp = []
 
37
                for vertex, code in zip(path.vertices, path.codes):
 
38
                    if len(pp) != 0 and code == 1:
 
39
                        pp.append(None)
 
40
                        pp.append(vertex.tolist())
 
41
                    else:
 
42
                        pp.append(vertex.tolist())
 
43
 
 
44
                Paths.append({"layer": l, "path": pp, "color": color})
 
45
 
 
46
        return {
 
47
                "xmin": time[0], 
 
48
                "xmax": time[-1], 
 
49
                "ymin": heights[0], 
 
50
                "ymax": heights[-1],
 
51
                "time": time,
 
52
                "data": Paths
 
53
               }
 
54
    
 
55
 
 
56
 
 
57
def main():
 
58
    # request parameters
 
59
    reqparams = cgi.FieldStorage()
 
60
    sensorName = reqparams["id"].value
 
61
    date_ = reqparams["date"].value
 
62
    dt = 86400
 
63
    #sensorName = 'L2C.AIR.POT.TEM.PRF'
 
64
    #date_ = '0d'
 
65
 
 
66
    serverInfo, groupName =  parseConfig(sensorName)
 
67
    adei_ = adeiReader()
 
68
    adei_.setup(serverInfo['db_name'], 
 
69
                serverInfo['db_server'], 
 
70
                serverInfo['db_host']) 
 
71
    
 
72
    t0, update = adei_.dostuff(groupName, sensorName, date_)
 
73
 
 
74
 
 
75
    filename = "../cache/%s.%s.%s.json" % (
 
76
            device_, sensorName, t0)
 
77
    symbolicname = "../cache/%s.%s.%s.json" % (
 
78
            device_, sensorName, date_)
 
79
 
 
80
    if update:
 
81
        res = adei_.getData(sensorName, groupName, t0, dt)
 
82
        with  open(filename, "w") as f:
 
83
            json.dump(res, f)
 
84
 
 
85
    # create symbolic name
 
86
    if os.path.exists(symbolicname):
 
87
        os.remove(symbolicname)
 
88
    os.symlink(filename, symbolicname)
 
89
 
 
90
 
 
91
 
 
92
if __name__ == "__main__":
 
93
    #cgitb.enable()
 
94
    content_type = 'text/plain; charset="UTF-8"'
 
95
    sys.stdout.write('Content-type: %s\n\n' % content_type)
 
96
 
 
97
    main()
 
98
 
 
99
    sys.exit()
 
100