/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/adeitools.py

  • 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:
10
10
import colorstring
11
11
 
12
12
CACHE_ = 0
 
13
DEBUG_ = 0
13
14
 
14
15
def print_exc():
15
16
    exctype, value, tb  = sys.exc_info()
61
62
    return zip(fields, *data)
62
63
 
63
64
def dictvalues(dlist, tag):
64
 
    return [d[tag] for d in dlist if tag in d.keys()]
 
65
    return [d[tag] or '' for d in dlist if tag in d.keys()]
65
66
 
66
67
 
67
68
class adeiReader:
69
70
        self.host = ''
70
71
        self.name = ''
71
72
        self.server = ''
72
 
        self.groups = []
 
73
        self.groups = {}
73
74
        self.sensors = []
74
75
        self.today = datetime.datetime(2013,5,30)
75
76
 
76
77
    def setup(self, db_name, db_server, db_host):
77
 
        self.groups = []
78
 
        self.sensors = []
 
78
        self.groups = {}
79
79
        self.name = db_name
80
80
        self.server = db_server
81
81
        self.host = db_host
82
82
 
83
83
        self.query_template = \
84
 
                "http://%s/adei/services/%s?db_server=%s&db_name=%s" % (
85
 
                db_host, '%s', db_server, db_name)
 
84
                "http://%s/adei/services/%s?db_server=%s&db_name=%s"\
 
85
                % (db_host, '%s', db_server, db_name)
86
86
 
87
87
        try:
88
88
            groups = dictvalues(self.listGroup(), 'db_group')
89
 
            dates = map(self.groupLastStamp, groups)
90
 
            self.groups = [ {
91
 
                    'name': g, 
92
 
                    'stamp': d,
93
 
                    'sensors': []
94
 
                    } for (g, d) in zip(groups, dates) ] 
95
 
                
 
89
 
96
90
            for g in groups:
97
 
                sensors = self.listSensor([g])
98
 
                names = dictvalues(sensors, 'column')
99
 
                id_ = dictvalues(sensors, 'value')
100
 
                self.sensors.extend([ {
101
 
                    'name': names[i], 
102
 
                    'group': g, 
103
 
                    'id': id_[i]
104
 
                    } for i in range(len(sensors)) ])
 
91
                date = self.groupLastStamp(g)
 
92
                
 
93
                sensors = {
 
94
                        int(s['value']): {
 
95
                            'name': s['column'],
 
96
                            'axis2_value': s['axis2_val']
 
97
                        } for s in self.listSensor(g) 
 
98
                        }
 
99
 
 
100
                self.groups[g] = {
 
101
                        'stamp': date,
 
102
                        'sensors': sensors
 
103
                }
 
104
 
 
105
                for k, v in sensors.iteritems():
 
106
                    v['id'] = k
 
107
                    v['group'] = g
 
108
                    self.sensors.append(v)
 
109
 
 
110
            if DEBUG_:
 
111
                for k, v in self.groups.iteritems():
 
112
                    print k
 
113
                    for s, ss in sorted(v['sensors'].items()):
 
114
                        print s, ss
 
115
                print self.sensors
105
116
 
106
117
            if not self.groups: 
107
118
                raise RuntimeError("no group found")
108
119
 
109
 
            if not self.sensors:
110
 
                raise RuntimeError("no sensor found")
111
 
 
112
120
        except IOError:
113
121
            print_exc()
114
122
            sys.exit(0)
118
126
        
119
127
 
120
128
    def listGroup(self):
121
 
        query_str = self.query_template % "list.php" + "&target=groups"
122
 
        return xmlparser(urllib.urlopen(query_str))
123
 
 
124
 
    def listSensor(self, groups=[]):
 
129
        url = self.query_template % "list.php" + "&target=groups"
 
130
        return xmlparser(urllib.urlopen(url))
 
131
 
 
132
 
 
133
    def listSensor(self, group):
125
134
        res = []
126
135
        url = self.query_template % "list.php" + "&target=items"
127
136
 
128
 
        #if group:
129
 
        #    groups = [group]
130
 
        #else:
131
 
        #    groups = dictvalues(self.groups, 'name')
132
 
        #for g in groups:
133
 
        for g in groups or dictvalues(self.groups, 'name'):
 
137
        for g in [group] or self.groups.keys():
134
138
            url += "&db_group=%s&info=1" % g
135
139
            res.extend( xmlparser(urllib.urlopen(url)) )
136
140
        return res
137
141
        
138
142
 
139
 
    def updateSensor(self, newkey, attr):
140
 
        for g in dictvalues(self.groups, 'name'):
141
 
            ids = dictvalues(self.listSensor([g]), 'value')
142
 
            attrs = dictvalues(self.listSensor([g]), attr)
143
 
 
144
 
            for id_, a_ in zip(ids, attrs):
145
 
                for i in range(len( self.sensors )):
146
 
                    if id_ == self.sensors[i]['id'] and g == self.sensors[i]['group']:
147
 
                        self.sensors[i][newkey] = a_
 
143
#    def updateSensor(self, newkey, attr):
 
144
#        for g in dictvalues(self.groups, 'name'):
 
145
#            ids = dictvalues(self.listSensor([g]), 'value')
 
146
#            attrs = dictvalues(self.listSensor([g]), attr)
 
147
#
 
148
#            for id_, a_ in zip(ids, attrs):
 
149
#                for i in range(len( self.sensors )):
 
150
#                    if id_ == self.sensors[i]['id'] and g == self.sensors[i]['group']:
 
151
#                        self.sensors[i][newkey] = a_
148
152
 
149
153
 
150
154
    def groupLastStamp(self, group, fmt='sec'):
171
175
            return res
172
176
 
173
177
 
174
 
    def sensorFilter(self, ss):
175
 
        pattern = "^%s.[0-9]{3}$" % ss
 
178
    def sensorFilter(self, sensorName, groupName):
 
179
        pattern = "^%s.[0-9]{3}$" % sensorName
176
180
        prog = re.compile(pattern)
177
 
        pattern2 = "^%s$" % ss
 
181
        pattern2 = "^%s$" % sensorName
178
182
        prog2 = re.compile(pattern2)
179
183
 
180
184
        res = []
181
 
        for i, sensor in enumerate(self.sensors):
 
185
        for i, sensor in self.groups[groupName]['sensors'].iteritems():
182
186
            if prog.match(sensor['name']) or prog2.match(sensor['name']):
183
187
                res.append(i)
184
188
        return res
185
189
 
186
190
 
187
 
    def getSensorData(self, id_, starttime, deltatime=86400, resample=10):
 
191
    def getSensorData(self, id_, groupname, starttime, deltatime=86400, resample=10):
188
192
        endtime = starttime + deltatime
189
193
        
190
194
        url =  self.query_template % "getdata.php"
191
 
        url += "&db_group=%s" % self.sensors[id_]['group']
192
 
        url += "&db_mask=%s" % self.sensors[id_]['id']
 
195
        url += "&db_group=%s" % groupname
 
196
        url += "&db_mask=%s" % id_
193
197
        url += "&window=%s-%s" % (starttime, endtime)
194
198
        url += "&resample=%s" % resample
195
199
        if CACHE_:
196
200
            url += "&cache=0"
197
201
 
198
202
        res = csvparser(urllib.urlopen(url))
 
203
        if DEBUG_:
 
204
            print res
199
205
        return res[1][1:]
200
206
 
201
 
    def getSensorTime(self, id_, starttime, deltatime=86400, resample=10):
 
207
    def getSensorTime(self, id_, groupname, starttime, deltatime=86400, resample=10):
202
208
        endtime = starttime + deltatime
203
209
        
204
210
        url =  self.query_template % "getdata.php"
205
 
        url += "&db_group=%s" % self.sensors[id_]['group']
206
 
        url += "&db_mask=%s" % self.sensors[id_]['id']
 
211
        url += "&db_group=%s" % groupname
 
212
        url += "&db_mask=%s" % id_
207
213
        url += "&window=%s-%s" % (starttime, endtime)
208
214
        url += "&resample=%s" % resample
209
215
        if CACHE_:
214
220
        return map(utcsecond, res[0][1:])
215
221
                
216
222
 
217
 
    def getSensorTimeData(self, id_, starttime, deltatime=86400, resample=10):
 
223
    def getSensorTimeData(self, id_, groupname, starttime, deltatime=86400, resample=10):
218
224
        endtime = starttime + deltatime
219
225
        
220
226
        url =  self.query_template % "getdata.php"
221
 
        url += "&db_group=%s" % self.sensors[id_]['group']
222
 
        url += "&db_mask=%s" % self.sensors[id_]['id']
 
227
        url += "&db_group=%s" % groupname 
 
228
        url += "&db_mask=%s" % id_
223
229
        url += "&window=%s-%s" % (starttime, endtime)
224
230
        url += "&resample=%s" % resample
225
231
        if CACHE_:
236
242
 
237
243
 
238
244
 
239
 
    def getMaskList(self, ss, group=''):
240
 
        pattern = "^%s.[0-9]{3}$" % ss
241
 
        prog = re.compile(pattern)
242
 
        pattern2 = "^%s$" % ss
243
 
        prog2 = re.compile(pattern2)
244
 
 
245
 
        maskstr = ""
246
 
        for sensor in self.sensors:
247
 
            if group:
248
 
                if (prog.match(sensor['name']) or prog2.match(sensor['name'])) and group == sensor['group']:
249
 
                    maskstr += ("%s" if maskstr == "" else ",%s") % sensor['id']
250
 
            else:
251
 
                if prog.match(sensor['name']) or prog2.match(sensor['name']):
252
 
                    maskstr += ("%s" if maskstr == "" else ",%s") % sensor['id']
253
 
 
254
 
        if maskstr:
255
 
            maskList = [int(x) for x in maskstr.split(',')]
256
 
            return maskList
257
 
        else:
258
 
            return None
259
 
     
260
 
 
261
 
    def getDataByMask(self, mask, grp, stime, deltatime=86400):
262
 
        st = stime
263
 
        et = stime + deltatime
264
 
 
265
 
        maskstr = ','.join([str(n) for  n in mask])
266
 
 
267
 
        query_str = "http://%s/adei/services/getdata.php?" % self.host
268
 
        query_str += "db_server=%s" % self.server
269
 
        query_str += "&db_name=%s" % self.name 
270
 
        query_str += "&db_group=%s" % grp
271
 
        query_str += "&db_mask=%s" % maskstr
272
 
        query_str += "&window=%s-%s" % (st, et)
273
 
 
274
 
        F = urllib.urlopen(query_str)
275
 
        try:
276
 
            csvreader = csv.reader(F, skipinitialspace=True)
277
 
        except Exception as ex:
278
 
            sys.stdout.write('{"error": "%s",     ' % 'unable to get ADEI data')
279
 
            sys.stdout.write('"exception": "%s"}\n' % type(ex).__name__)
280
 
 
281
 
        csvreader.next()
282
 
 
283
 
        time = []
284
 
        data = []
285
 
        for n, row in enumerate(csvreader):
286
 
            time.append(utcsecond(row[0]))
287
 
            data.append(row[1:])
288
 
        #print "%8d record read from adei" % (n+1)
289
 
 
290
 
        data = np.array(data, dtype='f')
291
 
        return [time, data.transpose()]
 
245
#    def getMaskList(self, ss, group=''):
 
246
#        pattern = "^%s.[0-9]{3}$" % ss
 
247
#        prog = re.compile(pattern)
 
248
#        pattern2 = "^%s$" % ss
 
249
#        prog2 = re.compile(pattern2)
 
250
#
 
251
#        maskstr = ""
 
252
#        for sensor in self.sensors:
 
253
#            if group:
 
254
#                if (prog.match(sensor['name']) or prog2.match(sensor['name'])) and group == sensor['group']:
 
255
#                    maskstr += ("%s" if maskstr == "" else ",%s") % sensor['id']
 
256
#            else:
 
257
#                if prog.match(sensor['name']) or prog2.match(sensor['name']):
 
258
#                    maskstr += ("%s" if maskstr == "" else ",%s") % sensor['id']
 
259
#
 
260
#        if maskstr:
 
261
#            maskList = [int(x) for x in maskstr.split(',')]
 
262
#            return maskList
 
263
#        else:
 
264
#            return None
 
265
#     
 
266
#
 
267
#    def getDataByMask(self, mask, grp, stime, deltatime=86400):
 
268
#        st = stime
 
269
#        et = stime + deltatime
 
270
#
 
271
#        maskstr = ','.join([str(n) for  n in mask])
 
272
#
 
273
#        query_str = "http://%s/adei/services/getdata.php?" % self.host
 
274
#        query_str += "db_server=%s" % self.server
 
275
#        query_str += "&db_name=%s" % self.name 
 
276
#        query_str += "&db_group=%s" % grp
 
277
#        query_str += "&db_mask=%s" % maskstr
 
278
#        query_str += "&window=%s-%s" % (st, et)
 
279
#
 
280
#        F = urllib.urlopen(query_str)
 
281
#        try:
 
282
#            csvreader = csv.reader(F, skipinitialspace=True)
 
283
#        except Exception as ex:
 
284
#            sys.stdout.write('{"error": "%s",     ' % 'unable to get ADEI data')
 
285
#            sys.stdout.write('"exception": "%s"}\n' % type(ex).__name__)
 
286
#
 
287
#        csvreader.next()
 
288
#
 
289
#        time = []
 
290
#        data = []
 
291
#        for n, row in enumerate(csvreader):
 
292
#            time.append(utcsecond(row[0]))
 
293
#            data.append(row[1:])
 
294
#        #print "%8d record read from adei" % (n+1)
 
295
#
 
296
#        data = np.array(data, dtype='f')
 
297
#        return [time, data.transpose()]
292
298
 
293
299
 
294
300
def main():