@@ -4,7 +4,7 import os | |||||
4 | import json |
|
4 | import json | |
5 |
|
5 | |||
6 | from datetime import datetime, timedelta |
|
6 | from datetime import datetime, timedelta | |
7 |
|
7 | import numpy | ||
8 | from pymongo import MongoClient |
|
8 | from pymongo import MongoClient | |
9 | import mongoengine |
|
9 | import mongoengine | |
10 | from asgiref.sync import async_to_sync |
|
10 | from asgiref.sync import async_to_sync | |
@@ -75,9 +75,6 class PlotConsumer(WebsocketConsumer): | |||||
75 | dt = datetime.strptime(text_data, '%d-%m-%Y') |
|
75 | dt = datetime.strptime(text_data, '%d-%m-%Y') | |
76 | code = self.scope['url_route']['kwargs']['code'] |
|
76 | code = self.scope['url_route']['kwargs']['code'] | |
77 | plot = self.scope['url_route']['kwargs']['plot'] |
|
77 | plot = self.scope['url_route']['kwargs']['plot'] | |
78 | # exp = DB.experiment.find_one({'code': int(code)}) |
|
|||
79 | # det0 = DB.exp_detail.find_one({'experiment': exp['_id'], 'date': dt-timedelta(days=1)}) |
|
|||
80 | # det1 = DB.exp_detail.find_one({'experiment': exp['_id'], 'date': dt}) |
|
|||
81 | exp = Experiment.objects.get(code=code) |
|
78 | exp = Experiment.objects.get(code=code) | |
82 | det0 = ExpDetail.objects(experiment=exp, date=dt-timedelta(days=1)) |
|
79 | det0 = ExpDetail.objects(experiment=exp, date=dt-timedelta(days=1)) | |
83 | det1 = ExpDetail.objects(experiment=exp, date=dt) |
|
80 | det1 = ExpDetail.objects(experiment=exp, date=dt) | |
@@ -85,22 +82,11 class PlotConsumer(WebsocketConsumer): | |||||
85 | if det1: |
|
82 | if det1: | |
86 | meta1 = PlotMeta.objects(exp_detail=det1[0], plot=plot) |
|
83 | meta1 = PlotMeta.objects(exp_detail=det1[0], plot=plot) | |
87 | if meta1: |
|
84 | if meta1: | |
88 | if plot == 'spc': |
|
85 | if meta1[0].metadata['type'] in ('pcolor',): | |
89 | datas = PlotData.objects(plot=meta1[0]).order_by('-time').first() |
|
86 | datas = PlotData.objects(plot=meta1[0]).order_by('-time').first() | |
90 | ret['time'] = [datas['time']] |
|
87 | ret['time'] = [datas['time']] | |
91 |
ret[' |
|
88 | ret['data'] = datas['data'] | |
92 |
ret['meta'] = |
|
89 | ret['metadata'] = meta1[0].metadata | |
93 | meta = PlotMeta.objects(exp_detail=det1[0], plot='rti') |
|
|||
94 | if meta: |
|
|||
95 | data = PlotData.objects(plot=meta[0], time=ret['time'][0]) |
|
|||
96 | if data: |
|
|||
97 | ret['rti'] = data[0]['data'] |
|
|||
98 |
|
||||
99 | meta = PlotMeta.objects(exp_detail=det1[0], plot='noise') |
|
|||
100 | if meta: |
|
|||
101 | data = PlotData.objects(plot=meta[0], time=ret['time'][0]) |
|
|||
102 | if data: |
|
|||
103 | ret['meta']['titles'] = ['{} dB'.format(x) for x in data[0]['data']] |
|
|||
104 | else: |
|
90 | else: | |
105 | last = det1[0]['last_time'] |
|
91 | last = det1[0]['last_time'] | |
106 | metas = [meta1[0]] |
|
92 | metas = [meta1[0]] | |
@@ -111,9 +97,12 class PlotConsumer(WebsocketConsumer): | |||||
111 | datas = PlotData.objects(plot__in=metas, time__gt=last-12*60*60).limit(720) |
|
97 | datas = PlotData.objects(plot__in=metas, time__gt=last-12*60*60).limit(720) | |
112 | dum = [(d['time'], d['data']) for d in datas] |
|
98 | dum = [(d['time'], d['data']) for d in datas] | |
113 | ret['time'] = [d[0] for d in dum] |
|
99 | ret['time'] = [d[0] for d in dum] | |
114 | dum = [d[1] for d in dum] |
|
100 | dum = numpy.array([d[1] for d in dum]) | |
115 | ret[plot] = [t for t in map(list, list(zip(*dum)))] |
|
101 | if len(dum[0][0])==1: | |
116 |
ret[' |
|
102 | ret['data'] = dum.T[0].tolist() | |
|
103 | else: | |||
|
104 | ret['data'] = [t for t in map(list, list(zip(*dum.tolist())))] | |||
|
105 | ret['metadata'] = metas[0].metadata | |||
117 |
|
106 | |||
118 | # exp.pop('date', None) |
|
107 | # exp.pop('date', None) | |
119 | # exp.pop('_id', None) |
|
108 | # exp.pop('_id', None) | |
@@ -124,49 +113,3 class PlotConsumer(WebsocketConsumer): | |||||
124 | def zmq_message(self, event): |
|
113 | def zmq_message(self, event): | |
125 | # Send message to WebSocket |
|
114 | # Send message to WebSocket | |
126 | self.send(text_data=event['message']) |
|
115 | self.send(text_data=event['message']) | |
127 |
|
||||
128 | def ws_message(message, id, code, plot): |
|
|||
129 | # Accept the incoming connection |
|
|||
130 | dt = datetime.strptime(str(json.loads(message.content['text'])['date']), '%d/%m/%Y') |
|
|||
131 | exp0 = DB.exp_meta.find_one({'code': int(code), 'date': dt-timedelta(days=1)}) |
|
|||
132 | exp = DB.exp_meta.find_one({'code': int(code), 'date': dt}) |
|
|||
133 | print(('New request for id={}'.format(id))) |
|
|||
134 | if exp and plot in exp['plots']: |
|
|||
135 | if plot == 'spc': |
|
|||
136 | datas = DB.exp_data.find({'expmeta': exp['_id']}, ['time', 'data']).sort('time', -1).limit(1)[0] |
|
|||
137 | exp['time'] = [datas['time']] |
|
|||
138 | exp['spc'] = datas['data']['spc'] |
|
|||
139 | exp['rti'] = datas['data']['rti'] |
|
|||
140 | exp['noise'] = datas['data']['noise'] |
|
|||
141 | else: |
|
|||
142 | last = DB.exp_data.find_one({'expmeta': exp['_id']}, ['time'], sort=[('time', -1)]) |
|
|||
143 | if exp0: |
|
|||
144 | datas = DB.exp_data.find( |
|
|||
145 | { |
|
|||
146 | 'expmeta': {'$in': [exp0['_id'], exp['_id']]}, |
|
|||
147 | 'time': {'$gt': last['time']-12*60*60} |
|
|||
148 | }, |
|
|||
149 | ['time', 'data'], |
|
|||
150 | sort=[('time', 1)], |
|
|||
151 | limit=720 |
|
|||
152 | ) |
|
|||
153 | else: |
|
|||
154 | datas = DB.exp_data.find( |
|
|||
155 | { |
|
|||
156 | 'expmeta': exp['_id'], |
|
|||
157 | 'time': {'$gt': last['time']-12*60*60} |
|
|||
158 | }, |
|
|||
159 | ['time', 'data'], |
|
|||
160 | sort=[('time', 1)], |
|
|||
161 | limit=720 |
|
|||
162 | ) |
|
|||
163 | dum = [(d['time'], d['data'][plot]) for d in datas] |
|
|||
164 | exp['time'] = [d[0] for d in dum] |
|
|||
165 | dum = [d[1] for d in dum] |
|
|||
166 | exp[plot] = [t for t in map(list, list(zip(*dum)))] |
|
|||
167 |
|
||||
168 | exp.pop('date', None) |
|
|||
169 | exp.pop('_id', None) |
|
|||
170 | message.reply_channel.send({'text': json.dumps(exp)}) |
|
|||
171 | else: |
|
|||
172 | message.reply_channel.send({'text': json.dumps({'interval': 0})}) |
|
@@ -16,6 +16,12 | |||||
16 | margin: 0px !important; |
|
16 | margin: 0px !important; | |
17 | } |
|
17 | } | |
18 |
|
18 | |||
|
19 | #loader { | |||
|
20 | background-image: url(/static/images/loader.gif); | |||
|
21 | background-repeat: no-repeat; | |||
|
22 | height: 40px; | |||
|
23 | } | |||
|
24 | ||||
19 | /* Change Buttons Bootstrap */ |
|
25 | /* Change Buttons Bootstrap */ | |
20 | .btn-primary { |
|
26 | .btn-primary { | |
21 | color: #fff; |
|
27 | color: #fff; |
@@ -16,18 +16,17 function list2dict(values) { | |||||
16 | }; |
|
16 | }; | |
17 | /* In this class is defined all the function to RTI plot */ |
|
17 | /* In this class is defined all the function to RTI plot */ | |
18 | class PcolorBuffer { |
|
18 | class PcolorBuffer { | |
19 |
constructor({ div, data, |
|
19 | constructor({ div, data, props }) { | |
20 | this.div = document.getElementById(div); |
|
20 | this.div = document.getElementById(div); | |
21 | this.n = 0; |
|
21 | this.n = 0; | |
22 | this.divs = []; |
|
22 | this.divs = []; | |
23 | this.wait = false; |
|
23 | this.wait = false; | |
24 | this.key = key; |
|
|||
25 | this.timer = (props.throttle || 30) * 1000; |
|
24 | this.timer = (props.throttle || 30) * 1000; | |
26 | this.lastRan = Date.now(); |
|
25 | this.lastRan = Date.now(); | |
27 | this.lastFunc = null; |
|
26 | this.lastFunc = null; | |
28 | this.zbuffer = []; |
|
27 | this.zbuffer = []; | |
29 | this.xbuffer = []; |
|
28 | this.xbuffer = []; | |
30 | this.empty = Array(data.meta.yrange.length).fill(null); |
|
29 | this.empty = Array(data.metadata.yrange.length).fill(null); | |
31 | this.props = props; |
|
30 | this.props = props; | |
32 | this.setup(data); |
|
31 | this.setup(data); | |
33 | } |
|
32 | } | |
@@ -35,21 +34,21 class PcolorBuffer { | |||||
35 | setup(data) { |
|
34 | setup(data) { | |
36 | this.last = data.time.slice(-1); |
|
35 | this.last = data.time.slice(-1); | |
37 | if (data.time.length == 1) { |
|
36 | if (data.time.length == 1) { | |
38 |
var values = { 'time': data.time, 'data': data[ |
|
37 | var values = { 'time': data.time, 'data': data['data'].map(function (x) { return [x] }) }; | |
39 | } else { |
|
38 | } else { | |
40 |
var values = this.fill_gaps(data.time, data[ |
|
39 | var values = this.fill_gaps(data.time, data['data'], data.metadata.interval, data['data'].length); | |
41 | } |
|
40 | } | |
42 | var t = values.time.map(function (x) { |
|
41 | var t = values.time.map(function (x) { | |
43 | var a = new Date(x * 1000); |
|
42 | var a = new Date(x * 1000); | |
44 | // This condition is used to change from UTC to LT |
|
43 | // This condition is used to change from UTC to LT | |
45 | if (data.localtime == true){ |
|
44 | if (data.metadata.localtime == true){ | |
46 | a.setTime( a.getTime() + a.getTimezoneOffset()*60*1000 ); |
|
45 | a.setTime( a.getTime() + a.getTimezoneOffset()*60*1000 ); | |
47 | } |
|
46 | } | |
48 | return a; |
|
47 | return a; | |
49 | }); |
|
48 | }); | |
50 |
|
49 | |||
51 | var label; |
|
50 | var label; | |
52 | if (data.localtime == true){ |
|
51 | if (data.metadata.localtime == true){ | |
53 | label = "[LT]"; |
|
52 | label = "[LT]"; | |
54 |
|
53 | |||
55 | } |
|
54 | } | |
@@ -57,7 +56,7 class PcolorBuffer { | |||||
57 | label = "[UTC]"; |
|
56 | label = "[UTC]"; | |
58 | } |
|
57 | } | |
59 |
|
58 | |||
60 |
for (var i = 0; i < data[ |
|
59 | for (var i = 0; i < data['data'].length; i++) { | |
61 | var layout = { |
|
60 | var layout = { | |
62 | height: 350, |
|
61 | height: 350, | |
63 | xaxis: { |
|
62 | xaxis: { | |
@@ -143,7 +142,7 class PcolorBuffer { | |||||
143 |
|
142 | |||
144 | for (var i = 1; i < xBuffer.length; i++) { |
|
143 | for (var i = 1; i < xBuffer.length; i++) { | |
145 | var cnt = 0; |
|
144 | var cnt = 0; | |
146 |
last = x. |
|
145 | last = x[x.length-1]; | |
147 | while (Math.abs(parseFloat(xBuffer[i]) - last ) > 1.5 * parseFloat(interval)) { |
|
146 | while (Math.abs(parseFloat(xBuffer[i]) - last ) > 1.5 * parseFloat(interval)) { | |
148 | cnt += 1; |
|
147 | cnt += 1; | |
149 | last = last + interval; |
|
148 | last = last + interval; | |
@@ -186,16 +185,16 class PcolorBuffer { | |||||
186 | // fill data gaps |
|
185 | // fill data gaps | |
187 | var cnt = 0; |
|
186 | var cnt = 0; | |
188 |
|
187 | |||
189 | while (Math.abs(parseFloat(obj.time[0]) - this.last) > 1.5 * parseFloat(obj.interval)) { |
|
188 | while (Math.abs(parseFloat(obj.time[0]) - this.last) > 1.5 * parseFloat(obj.metadata.interval)) { | |
190 | cnt += 1; |
|
189 | cnt += 1; | |
191 | this.last += obj.interval; |
|
190 | this.last += obj.metadata.interval; | |
192 | var newt = new Date((this.last) * 1000); |
|
191 | var newt = new Date((this.last) * 1000); | |
193 | // This condition is used to change from UTC to LT |
|
192 | // This condition is used to change from UTC to LT | |
194 | if (obj.localtime == true){ |
|
193 | if (obj.metadata.localtime == true){ | |
195 | newt.setTime( newt.getTime() + newt.getTimezoneOffset()*60*1000 ); |
|
194 | newt.setTime( newt.getTime() + newt.getTimezoneOffset()*60*1000 ); | |
196 | } |
|
195 | } | |
197 | this.xbuffer.push(newt); |
|
196 | this.xbuffer.push(newt); | |
198 |
for (var i = 0; i < obj[ |
|
197 | for (var i = 0; i < obj['data'].length; i++) { | |
199 | this.zbuffer[i].push(this.empty); |
|
198 | this.zbuffer[i].push(this.empty); | |
200 | } |
|
199 | } | |
201 | // Avoid infinite loop |
|
200 | // Avoid infinite loop | |
@@ -206,12 +205,12 class PcolorBuffer { | |||||
206 | this.last = parseFloat(obj.time[0]); |
|
205 | this.last = parseFloat(obj.time[0]); | |
207 | var t = new Date(obj.time[0] * 1000); |
|
206 | var t = new Date(obj.time[0] * 1000); | |
208 | // This condition is used to change from UTC to LT |
|
207 | // This condition is used to change from UTC to LT | |
209 | if (obj.localtime == true){ |
|
208 | if (obj.metadata.localtime == true){ | |
210 | t.setTime( t.getTime() + t.getTimezoneOffset()*60*1000 ); |
|
209 | t.setTime( t.getTime() + t.getTimezoneOffset()*60*1000 ); | |
211 | } |
|
210 | } | |
212 | this.xbuffer.push(t); |
|
211 | this.xbuffer.push(t); | |
213 |
for (var i = 0; i < obj[ |
|
212 | for (var i = 0; i < obj['data'].length; i++) { | |
214 |
this.zbuffer[i].push(obj[ |
|
213 | this.zbuffer[i].push(obj['data'][i]); | |
215 | var div = document.getElementById(this.divs[i]); |
|
214 | var div = document.getElementById(this.divs[i]); | |
216 | Plotly.relayout(div, { |
|
215 | Plotly.relayout(div, { | |
217 | title: 'Ch ' + i + ' - ' + t.toLocaleString(), |
|
216 | title: 'Ch ' + i + ' - ' + t.toLocaleString(), | |
@@ -267,7 +266,7 class Pcolor { | |||||
267 | } |
|
266 | } | |
268 | /* This function is used to plot all the data that have the DB and just is used when is loaded or reloaded*/ |
|
267 | /* This function is used to plot all the data that have the DB and just is used when is loaded or reloaded*/ | |
269 | setup(data) { |
|
268 | setup(data) { | |
270 |
for (var i = 0; i < data |
|
269 | for (var i = 0; i < data['data'].length; i++) { | |
271 | var layout = { |
|
270 | var layout = { | |
272 | margin: { |
|
271 | margin: { | |
273 | t:30, |
|
272 | t:30, | |
@@ -287,7 +286,6 class Pcolor { | |||||
287 | linewidth: 2, |
|
286 | linewidth: 2, | |
288 | mirror: 'all', |
|
287 | mirror: 'all', | |
289 | size: 12, |
|
288 | size: 12, | |
290 | //range: [data.meta.yrange[0], data.meta.yrange.slice(-1)[0]], |
|
|||
291 |
|
|
289 | }, | |
292 | titlefont: { |
|
290 | titlefont: { | |
293 | size: 14 |
|
291 | size: 14 | |
@@ -303,14 +301,14 class Pcolor { | |||||
303 | iDiv.className = 'col-md-1'; |
|
301 | iDiv.className = 'col-md-1'; | |
304 | this.div.appendChild(iDiv); |
|
302 | this.div.appendChild(iDiv); | |
305 | var trace1 = { |
|
303 | var trace1 = { | |
306 |
z: data |
|
304 | z: data['data'][i], | |
307 | y: data.meta.yrange, |
|
305 | y: data.metadata.yrange, | |
308 | x: data.meta.xrange, |
|
306 | x: data.metadata.xrange, | |
309 | colorscale: this.props.colormap || 'Jet', |
|
307 | colorscale: this.props.colormap || 'Jet', | |
310 | transpose: true, |
|
308 | transpose: true, | |
311 | type: 'heatmap' |
|
309 | type: 'heatmap' | |
312 | }; |
|
310 | }; | |
313 |
|
311 | /* | ||
314 | if ('rti' in data){ |
|
312 | if ('rti' in data){ | |
315 | layout.xaxis.domain = [0, 0.7]; |
|
313 | layout.xaxis.domain = [0, 0.7]; | |
316 | layout.xaxis2 = { |
|
314 | layout.xaxis2 = { | |
@@ -323,29 +321,26 class Pcolor { | |||||
323 | }; |
|
321 | }; | |
324 | var trace2 = { |
|
322 | var trace2 = { | |
325 | x: data.rti[i], |
|
323 | x: data.rti[i], | |
326 | y: data.meta.yrange, |
|
324 | y: data.metadata.yrange, | |
327 | xaxis: 'x2', |
|
325 | xaxis: 'x2', | |
328 | type: 'scatter', |
|
326 | type: 'scatter', | |
329 | }; |
|
327 | }; | |
330 | } |
|
328 | } | |
331 |
|
329 | */ | ||
332 | if (this.props.zmin) { |
|
330 | if (this.props.zmin) { | |
333 | trace1.zmin = this.props.zmin |
|
331 | trace1.zmin = this.props.zmin | |
334 | } |
|
332 | } | |
335 | if (this.props.zmax) { |
|
333 | if (this.props.zmax) { | |
336 | trace1.zmax = this.props.zmax; |
|
334 | trace1.zmax = this.props.zmax; | |
337 | if ('rti' in data){ |
|
|||
338 | layout.xaxis2.range = [this.props.zmin, this.props.zmax] |
|
|||
339 | } |
|
|||
340 | } |
|
335 | } | |
341 |
|
336 | |||
342 | var t = new Date(data.time * 1000); |
|
337 | var t = new Date(data.time * 1000); | |
343 | // This condition is used to change from UTC to LT |
|
338 | // This condition is used to change from UTC to LT | |
344 | if (data.localtime == true){ |
|
339 | if (data.metadata.localtime == true){ | |
345 | t.setTime( t.getTime() + t.getTimezoneOffset()*60*1000 ); |
|
340 | t.setTime( t.getTime() + t.getTimezoneOffset()*60*1000 ); | |
346 | } |
|
341 | } | |
347 | if ('titles' in data.meta){ |
|
342 | if ('titles' in data.metadata){ | |
348 | layout.title = 'Ch ' + i + ': ' + data.meta.titles[i] + ' ' + t.toLocaleString(); |
|
343 | layout.title = 'Ch ' + i + ': ' + data.metadata.titles[i] + ' ' + t.toLocaleString(); | |
349 | }else{ |
|
344 | }else{ | |
350 | layout.title = 'Ch ' + i + ': ' + t.toLocaleString(); |
|
345 | layout.title = 'Ch ' + i + ': ' + t.toLocaleString(); | |
351 | } |
|
346 | } | |
@@ -363,34 +358,39 class Pcolor { | |||||
363 | displaylogo: false, |
|
358 | displaylogo: false, | |
364 | showTips: true |
|
359 | showTips: true | |
365 | }; |
|
360 | }; | |
366 | if ('rti' in data){ |
|
361 | ||
367 |
|
|
362 | var traces = [trace1] | |
368 |
|
|
363 | ||
369 | var traces = [trace1] |
|
|||
370 | } |
|
|||
371 | Plotly.newPlot('plot-' + i, traces, layout, conf); |
|
364 | Plotly.newPlot('plot-' + i, traces, layout, conf); | |
372 | } |
|
365 | } | |
373 | } |
|
366 | } | |
374 |
|
367 | |||
375 | plot(obj) { |
|
368 | plot(obj) { | |
376 |
|
|
369 | this.data = obj; | |
377 |
|
|
370 | // add new data to plots and empty buffers | |
378 | console.log('Plotting...'); |
|
371 | console.log('Plotting...'); | |
379 | var t = new Date(obj.time[0] * 1000); |
|
372 | var t = new Date(obj.time[0] * 1000); | |
380 | // This condition is used to change from UTC to LT |
|
373 | // This condition is used to change from UTC to LT | |
381 | if (obj.localtime == true){ |
|
374 | if (obj.metadata.localtime == true){ | |
382 | t.setTime( t.getTime() + t.getTimezoneOffset()*60*1000 ); |
|
375 | t.setTime( t.getTime() + t.getTimezoneOffset()*60*1000 ); | |
383 | } |
|
376 | } | |
384 | for (var i = 0; i < this.n; i++) { |
|
377 | for (var i = 0; i < this.n; i++) { | |
385 | var div = document.getElementById(this.divs[i]); |
|
378 | var div = document.getElementById(this.divs[i]); | |
386 | Plotly.relayout(div, { |
|
379 | ||
387 | title: 'Ch ' + i + ': ' + obj.noise[i] + 'dB - ' + t.toLocaleString(), |
|
380 | if ('titles' in obj.metadata){ | |
|
381 | var title = 'Ch ' + i + ': ' + obj.metadata.titles[i] + ' ' + t.toLocaleString(); | |||
|
382 | }else{ | |||
|
383 | var title = 'Ch ' + i + ': ' + t.toLocaleString(); | |||
|
384 | } | |||
388 |
|
385 | |||
|
386 | Plotly.relayout(div, { | |||
|
387 | title: title, | |||
389 | }); |
|
388 | }); | |
|
389 | ||||
390 | Plotly.restyle(div, { |
|
390 | Plotly.restyle(div, { | |
391 |
z: [obj |
|
391 | z: [obj['data'][i]], | |
392 |
x: [obj.xrange |
|
392 | x: [obj.xrange] | |
393 |
}, [0 |
|
393 | }, [0]); | |
394 | } |
|
394 | } | |
395 | } |
|
395 | } | |
396 |
|
396 | |||
@@ -437,10 +437,9 class Pcolor { | |||||
437 | } |
|
437 | } | |
438 | /* In this class is defined all the function to Scatter(noise) plot */ |
|
438 | /* In this class is defined all the function to Scatter(noise) plot */ | |
439 | class Scatter { |
|
439 | class Scatter { | |
440 |
constructor({ div, data, |
|
440 | constructor({ div, data, props }) { | |
441 | this.div = document.getElementById(div); |
|
441 | this.div = document.getElementById(div); | |
442 | this.n = 0; |
|
442 | this.n = 0; | |
443 | this.key = key; |
|
|||
444 | this.wait = false; |
|
443 | this.wait = false; | |
445 | this.timer = (props.throttle || 30) * 1000; |
|
444 | this.timer = (props.throttle || 30) * 1000; | |
446 | this.lastRan = Date.now(); |
|
445 | this.lastRan = Date.now(); | |
@@ -448,30 +447,31 class Scatter { | |||||
448 | this.ybuffer = []; |
|
447 | this.ybuffer = []; | |
449 | this.xbuffer = []; |
|
448 | this.xbuffer = []; | |
450 | this.props = props; |
|
449 | this.props = props; | |
|
450 | console.log(data); | |||
451 | this.setup(data); |
|
451 | this.setup(data); | |
452 | } |
|
452 | } | |
453 | /* This function is used to plot all the data that have the DB and just is used when is loaded or reloaded*/ |
|
453 | /* This function is used to plot all the data that have the DB and just is used when is loaded or reloaded*/ | |
454 | setup(data) { |
|
454 | setup(data) { | |
455 |
|
455 | |||
456 | this.data = data; //le agrego juan carlos para ver la data en mi consola |
|
456 | //this.data = data; | |
457 | var traces = []; |
|
457 | var traces = []; | |
458 | this.last = data.time.slice(-1); |
|
458 | this.last = data.time.slice(-1); | |
459 | if (data.time.length == 1) { |
|
459 | if (data.time.length == 1) { | |
460 |
var values = { 'time': data.time, 'data': data[ |
|
460 | var values = { 'time': data.time, 'data': data['data'] }; | |
461 | } else { |
|
461 | } else { | |
462 |
var values = this.fill_gaps(data.time, data[ |
|
462 | var values = this.fill_gaps(data.time, data['data'], data.metadata.interval, data['data'].length); | |
463 | } |
|
463 | } | |
464 |
|
464 | |||
465 | var t = values.time.map(function (x) { |
|
465 | var t = values.time.map(function (x) { | |
466 | var a = new Date(x * 1000); |
|
466 | var a = new Date(x * 1000); | |
467 | // This condition is used to change from UTC to LT |
|
467 | // This condition is used to change from UTC to LT | |
468 | if (data.localtime == true){ |
|
468 | if (data.metadata.localtime == true){ | |
469 | a.setTime( a.getTime() + a.getTimezoneOffset()*60*1000 ); |
|
469 | a.setTime( a.getTime() + a.getTimezoneOffset()*60*1000 ); | |
470 | } |
|
470 | } | |
471 | return a; |
|
471 | return a; | |
472 | }); |
|
472 | }); | |
473 |
|
473 | |||
474 |
for (var i = 0; i < data[ |
|
474 | for (var i = 0; i < data['data'].length; i++) { | |
475 |
|
475 | |||
476 | this.n = this.n + 1; |
|
476 | this.n = this.n + 1; | |
477 | this.ybuffer.push([]); |
|
477 | this.ybuffer.push([]); | |
@@ -488,7 +488,7 class Scatter { | |||||
488 | } |
|
488 | } | |
489 |
|
489 | |||
490 | var label; |
|
490 | var label; | |
491 | if (data.localtime == true){ |
|
491 | if (data.metadata.localtime == true){ | |
492 | label = "[LT]"; |
|
492 | label = "[LT]"; | |
493 |
|
493 | |||
494 | } |
|
494 | } | |
@@ -563,7 +563,7 class Scatter { | |||||
563 | for (var i = 1; i < xBuffer.length; i++) { |
|
563 | for (var i = 1; i < xBuffer.length; i++) { | |
564 | var cnt = 0; |
|
564 | var cnt = 0; | |
565 | last = x.slice(-1)[0]; |
|
565 | last = x.slice(-1)[0]; | |
566 | console.log(Math.abs(parseFloat(xBuffer[i]) - last) + ' '+ parseFloat(interval)); |
|
566 | //console.log(Math.abs(parseFloat(xBuffer[i]) - last) + ' '+ parseFloat(interval)); | |
567 | while (Math.abs(parseFloat(xBuffer[i]) - last) > 1.5 * parseFloat(interval)) { |
|
567 | while (Math.abs(parseFloat(xBuffer[i]) - last) > 1.5 * parseFloat(interval)) { | |
568 | cnt += 1; |
|
568 | cnt += 1; | |
569 | last = last + interval; |
|
569 | last = last + interval; | |
@@ -609,15 +609,14 class Scatter { | |||||
609 | } |
|
609 | } | |
610 | //This function just add the last data and is used if previously was used setup() |
|
610 | //This function just add the last data and is used if previously was used setup() | |
611 | update(obj) { |
|
611 | update(obj) { | |
612 |
|
||||
613 | // fill data gaps |
|
612 | // fill data gaps | |
614 | var cnt = 0; |
|
613 | var cnt = 0; | |
615 | while (Math.abs(parseFloat(obj.time[0]) - this.last ) > 1.5 * parseFloat(obj.interval)) { |
|
614 | while (Math.abs(parseFloat(obj.time[0]) - this.last ) > 1.5 * parseFloat(obj.metadata.interval)) { | |
616 | cnt += 1; |
|
615 | cnt += 1; | |
617 | this.last += obj.interval; |
|
616 | this.last += obj.metadata.interval; | |
618 | var newt = new Date((this.last) * 1000); |
|
617 | var newt = new Date((this.last) * 1000); | |
619 | // This condition is used to change from UTC to LT |
|
618 | // This condition is used to change from UTC to LT | |
620 | if (obj.localtime == true){ |
|
619 | if (obj.metadata.localtime == true){ | |
621 | newt.setTime( newt.getTime() + newt.getTimezoneOffset()*60*1000 ); |
|
620 | newt.setTime( newt.getTime() + newt.getTimezoneOffset()*60*1000 ); | |
622 | } |
|
621 | } | |
623 | this.xbuffer.push(newt); |
|
622 | this.xbuffer.push(newt); | |
@@ -632,12 +631,12 class Scatter { | |||||
632 | this.last = parseFloat(obj.time[0]); |
|
631 | this.last = parseFloat(obj.time[0]); | |
633 | var t = new Date(obj.time[0] * 1000); |
|
632 | var t = new Date(obj.time[0] * 1000); | |
634 | // This condition is used to change from UTC to LT |
|
633 | // This condition is used to change from UTC to LT | |
635 | if (obj.localtime == true){ |
|
634 | if (obj.metadata.localtime == true){ | |
636 | t.setTime( t.getTime() + t.getTimezoneOffset()*60*1000 ); |
|
635 | t.setTime( t.getTime() + t.getTimezoneOffset()*60*1000 ); | |
637 | } |
|
636 | } | |
638 | this.xbuffer.push(t); |
|
637 | this.xbuffer.push(t); | |
639 | for (var i = 0; i < this.n; i++) { |
|
638 | for (var i = 0; i < this.n; i++) { | |
640 |
this.ybuffer[i].push(obj[ |
|
639 | this.ybuffer[i].push(obj['data'][i][0]); | |
641 | } |
|
640 | } | |
642 |
|
641 | |||
643 | Plotly.relayout(this.div, { |
|
642 | Plotly.relayout(this.div, { |
@@ -10,7 +10,7 | |||||
10 | <div id="card_body_{{exp.code}}"class="card-body"> |
|
10 | <div id="card_body_{{exp.code}}"class="card-body"> | |
11 | <div id="date_{{exp.code}}">Last data: {{exp.date | date:"h:i:s a" }}</div> |
|
11 | <div id="date_{{exp.code}}">Last data: {{exp.date | date:"h:i:s a" }}</div> | |
12 | {% for plot in exp.plots %} |
|
12 | {% for plot in exp.plots %} | |
13 | <a class="btn btn-outline-{{exp.style}}" href="{% url 'url-plot' exp.code plot %}" role="button">{{plot}}</a> |
|
13 | <a class="btn btn-outline-{{exp.style}}" href="{% url 'url-plot' exp.code plot.plot %}" role="button">{{plot.name}}</a> | |
14 | {% endfor %} |
|
14 | {% endfor %} | |
15 | </div> |
|
15 | </div> | |
16 | </div></div> |
|
16 | </div></div> |
@@ -3,10 +3,10 | |||||
3 | <div class="p-4 text-igp"> |
|
3 | <div class="p-4 text-igp"> | |
4 | <h3>{{title}} <small> {{subtitle}}</small></h3> |
|
4 | <h3>{{title}} <small> {{subtitle}}</small></h3> | |
5 | </div> |
|
5 | </div> | |
6 | <div class="justify-content-center"> |
|
6 | <div class="row justify-content-center"> | |
7 |
<div id="loader" class="loader |
|
7 | <div id="loader" class="col-sm-2 loader"></div> | |
8 | </div> |
|
8 | </div> | |
9 |
<div id="plot" {%if |
|
9 | <div id="plot" {%if meta.metadata.type == 'pcolor' %}class="row"{%endif%}></div> | |
10 |
|
10 | |||
11 | {% endblock content %} {% block modal %} |
|
11 | {% endblock content %} {% block modal %} | |
12 | <!-- Modal --> |
|
12 | <!-- Modal --> | |
@@ -50,7 +50,6 | |||||
50 |
|
50 | |||
51 | socket.onmessage = function message(event) { |
|
51 | socket.onmessage = function message(event) { | |
52 | var data = JSON.parse(event.data); |
|
52 | var data = JSON.parse(event.data); | |
53 | console.log(data); |
|
|||
54 | if (data.interval == 0) { |
|
53 | if (data.interval == 0) { | |
55 | $("#loader").removeClass("loader").addClass("no-data"); |
|
54 | $("#loader").removeClass("loader").addClass("no-data"); | |
56 | $("#loader").html("No data found"); |
|
55 | $("#loader").html("No data found"); | |
@@ -73,12 +72,11 | |||||
73 | plt = new {{ fn_plot }} ({ |
|
72 | plt = new {{ fn_plot }} ({ | |
74 | div: 'plot', |
|
73 | div: 'plot', | |
75 | data: data, |
|
74 | data: data, | |
76 | key: '{{plot}}', |
|
|||
77 | props: { throttle: 30, timespan: 12, colormap: 'Jet' }, |
|
75 | props: { throttle: 30, timespan: 12, colormap: 'Jet' }, | |
78 | }); |
|
76 | }); | |
79 | return true; |
|
77 | return true; | |
80 | } else { |
|
78 | } else { | |
81 | plt.update(data); |
|
79 | plt.update(data); | |
82 | return false; |
|
80 | return false; | |
83 | } |
|
81 | } | |
84 | } |
|
82 | } |
@@ -6,5 +6,5 urlpatterns = [ | |||||
6 | url(r'^$', main, name='url_main'), |
|
6 | url(r'^$', main, name='url_main'), | |
7 | url(r'^tools/$', tools, name='url_tools'), |
|
7 | url(r'^tools/$', tools, name='url_tools'), | |
8 | url(r'^reports/$', reports, name='url_reports'), |
|
8 | url(r'^reports/$', reports, name='url_reports'), | |
9 |
url(r'^(?P<code>[0-9]+)/(?P<plot>[ |
|
9 | url(r'^(?P<code>[0-9]+)/(?P<plot>[-\w]+)/$', plot, name='url-plot'), | |
10 | ] |
|
10 | ] |
@@ -75,15 +75,15 def main(request): | |||||
75 | for exp in exps: |
|
75 | for exp in exps: | |
76 | dum = {} |
|
76 | dum = {} | |
77 | dum['code'] = exp.experiment.code |
|
77 | dum['code'] = exp.experiment.code | |
78 |
dum['plots'] = [ |
|
78 | dum['plots'] = [] | |
79 | dum['name'] = exp.experiment.name |
|
79 | dum['name'] = exp.experiment.name | |
80 | dt = datetime.now() |
|
80 | dt = datetime.now() | |
81 |
|
81 | |||
82 | t = time.mktime(dt.timetuple()) |
|
82 | t = time.mktime(dt.timetuple()) | |
83 |
|
83 | |||
84 |
if exp.plots()[0]['metadata']['localtime'] == True: |
|
84 | if exp.plots()[0]['metadata']['localtime'] == True: | |
85 | t -= 5*60*60 |
|
85 | t -= 5*60*60 | |
86 | # COnditionals to know which state are my clients |
|
86 | ||
87 | if (t-exp['last_time']) > 10*60: |
|
87 | if (t-exp['last_time']) > 10*60: | |
88 | status = 'Offline' |
|
88 | status = 'Offline' | |
89 | clase = 'alertas-offline' |
|
89 | clase = 'alertas-offline' | |
@@ -104,7 +104,8 def main(request): | |||||
104 | dum['class'] = clase |
|
104 | dum['class'] = clase | |
105 | dum['style']= style |
|
105 | dum['style']= style | |
106 | dum['date']= datetime.utcfromtimestamp(lastDataDate) |
|
106 | dum['date']= datetime.utcfromtimestamp(lastDataDate) | |
107 |
|
107 | for plot in exp.plots(): | ||
|
108 | dum['plots'].append({'plot': plot.plot, 'name': plot.plot.replace('_', ' ').title(), 'id':plot.id}) | |||
108 | experiments.append(dum) |
|
109 | experiments.append(dum) | |
109 |
|
110 | |||
110 | kwargs['date'] = date |
|
111 | kwargs['date'] = date | |
@@ -145,26 +146,24 def plot(request, code=None, plot=None): | |||||
145 | kwargs = { |
|
146 | kwargs = { | |
146 | 'code': code, |
|
147 | 'code': code, | |
147 | 'plot': plot, |
|
148 | 'plot': plot, | |
|
149 | 'meta':meta, | |||
148 | 'date': date, |
|
150 | 'date': date, | |
149 | 'id': meta.pk, |
|
151 | 'id': meta.pk, | |
150 | 'realtime': realtime, |
|
152 | 'realtime': realtime, | |
151 | 'menu_list': ['Realtime', exp.name] |
|
153 | 'menu_list': ['Realtime', exp.name, meta.plot.replace('_', ' ').title()] | |
152 | } |
|
154 | } | |
153 | # Logic to show my views |
|
155 | # Logic to show my views | |
154 | if plot == 'rti': |
|
156 | if meta.metadata['type'] == 'pcolorbuffer': | |
155 | kwargs['setup_form'] = RTISetupForm() |
|
157 | kwargs['setup_form'] = RTISetupForm() | |
156 | kwargs['fn_plot'] = 'PcolorBuffer' |
|
158 | kwargs['fn_plot'] = 'PcolorBuffer' | |
157 | kwargs['menu_list'].append('RTI plot') |
|
|||
158 | return render(request, 'plot.html', kwargs) |
|
159 | return render(request, 'plot.html', kwargs) | |
159 | elif plot == 'spc': |
|
160 | elif meta.metadata['type'] == 'pcolor': | |
160 | kwargs['setup_form'] = SPCSetupForm() |
|
161 | kwargs['setup_form'] = SPCSetupForm() | |
161 | kwargs['fn_plot'] = 'Pcolor' |
|
162 | kwargs['fn_plot'] = 'Pcolor' | |
162 | kwargs['menu_list'].append('Spectra plot') |
|
|||
163 | return render(request, 'plot.html', kwargs) |
|
163 | return render(request, 'plot.html', kwargs) | |
164 | elif plot == 'noise': |
|
164 | elif meta.metadata['type'] == 'scatter': | |
165 | kwargs['setup_form'] = ScatterSetupForm() |
|
165 | kwargs['setup_form'] = ScatterSetupForm() | |
166 | kwargs['fn_plot'] = 'Scatter' |
|
166 | kwargs['fn_plot'] = 'Scatter' | |
167 | kwargs['menu_list'].append('Noise plot') |
|
|||
168 | return render(request, 'plot.html', kwargs) |
|
167 | return render(request, 'plot.html', kwargs) | |
169 | else: |
|
168 | else: | |
170 | return render(request, 'home.html', {}) |
|
169 | return render(request, 'home.html', {}) |
@@ -26,6 +26,7 def send(dato): | |||||
26 | poll.register(socket, zmq.POLLIN) |
|
26 | poll.register(socket, zmq.POLLIN) | |
27 | retries = RETRIES |
|
27 | retries = RETRIES | |
28 | while True: |
|
28 | while True: | |
|
29 | print(dato['plot']) | |||
29 | socket.send_json(dato) |
|
30 | socket.send_json(dato) | |
30 | socks = dict(poll.poll(REQUEST_TIMEOUT)) |
|
31 | socks = dict(poll.poll(REQUEST_TIMEOUT)) | |
31 | if socks.get(socket) == zmq.POLLIN: |
|
32 | if socks.get(socket) == zmq.POLLIN: | |
@@ -62,33 +63,36 def main(realtime, code, date=None, interval=30): | |||||
62 | else: |
|
63 | else: | |
63 | dt = date |
|
64 | dt = date | |
64 |
|
65 | |||
65 | data = { |
|
|||
66 | 'spc': np.round(np.random.rand(4, 60, 100)*5 + 10, 2).tolist(), |
|
|||
67 | 'rti': np.round(np.random.rand(4, 100)*5 + 10, 2).tolist(), |
|
|||
68 | 'noise': np.round(np.random.rand(4) + np.array([10,11,12,13]), 2).tolist() |
|
|||
69 | } |
|
|||
70 |
|
||||
71 | while True: |
|
66 | while True: | |
72 |
|
67 | |||
73 | print(('Sending {} - {}'.format(code, dt))) |
|
68 | print(('Sending {} - {}'.format(code, dt))) | |
74 |
|
69 | |||
|
70 | data = { | |||
|
71 | 'pcolor': ('Spectra', np.round(np.random.rand(4, 60, 100)*5 + 10, 2).tolist()), | |||
|
72 | 'pcolorbuffer': ('RTI', np.round(np.random.rand(4, 100)*5 + 10, 2).tolist()), | |||
|
73 | 'scatter': ('Power noise', np.round(np.random.rand(4, 1) + np.array([[10],[11],[12],[13]]), 2).tolist()) | |||
|
74 | } | |||
|
75 | ||||
75 | dato = { |
|
76 | dato = { | |
76 | 'time': time.mktime(dt.timetuple()), |
|
77 | 'time': time.mktime(dt.timetuple()), | |
77 | 'metadata':{ |
|
78 | 'metadata':{ | |
78 | 'yrange': np.arange(80, 120, 40/100.).tolist(), |
|
79 | 'yrange': np.arange(80, 120, 40/100.).tolist(), | |
79 | 'xrange': np.arange(-30, 30).tolist(), |
|
80 | 'xrange': np.arange(-30, 30).tolist(), | |
80 | 'localtime': True, |
|
81 | 'localtime': True, | |
81 | 'interval': interval |
|
82 | 'interval': interval, | |
|
83 | 'type': '', | |||
82 | }, |
|
84 | }, | |
83 |
' |
|
85 | 'code': code, | |
84 | } |
|
86 | } | |
85 |
|
87 | |||
86 | dt = dt + timedelta(seconds=interval) |
|
88 | dt = dt + timedelta(seconds=interval) | |
87 | for plot, d in data.items(): |
|
89 | for plot, d in data.items(): | |
88 |
dato['plot'] = |
|
90 | dato['plot'] = d[0] | |
89 |
dato['data'] = |
|
91 | dato['metadata']['type'] = plot | |
90 | t = Thread(target=send, args=(dato, )) |
|
92 | dato['data'] = d[1] | |
91 |
|
|
93 | send(dato) | |
|
94 | # t = Thread(target=send, args=(dato, )) | |||
|
95 | # t.start() | |||
92 | if realtime: |
|
96 | if realtime: | |
93 | time.sleep(interval) |
|
97 | time.sleep(interval) | |
94 | else: |
|
98 | else: |
@@ -43,7 +43,7 def loaddata(): | |||||
43 | #============== funcion para modificar datos en la tabla ============== |
|
43 | #============== funcion para modificar datos en la tabla ============== | |
44 | def update(buffer): |
|
44 | def update(buffer): | |
45 | dt = datetime.utcfromtimestamp(buffer['time']) |
|
45 | dt = datetime.utcfromtimestamp(buffer['time']) | |
46 |
exp = Experiment.objects.get(code=buffer[' |
|
46 | exp = Experiment.objects.get(code=buffer['code']) | |
47 |
|
47 | |||
48 | detail = ExpDetail.objects(experiment=exp, date=dt.date()).modify( |
|
48 | detail = ExpDetail.objects(experiment=exp, date=dt.date()).modify( | |
49 | upsert=True, |
|
49 | upsert=True, | |
@@ -53,7 +53,8 def update(buffer): | |||||
53 | set__last_time = buffer['time'] |
|
53 | set__last_time = buffer['time'] | |
54 | ) |
|
54 | ) | |
55 |
|
55 | |||
56 | plot = PlotMeta.objects(exp_detail=detail, plot=buffer['plot']).modify( |
|
56 | label = buffer['plot'].replace(' ', '_').lower() | |
|
57 | plot = PlotMeta.objects(exp_detail=detail, plot=label).modify( | |||
57 | upsert=True, |
|
58 | upsert=True, | |
58 | new=True, |
|
59 | new=True, | |
59 | set__metadata = buffer['metadata'] |
|
60 | set__metadata = buffer['metadata'] | |
@@ -89,8 +90,6 def check_times(): | |||||
89 |
|
90 | |||
90 | if plot['metadata']['localtime'] == True: |
|
91 | if plot['metadata']['localtime'] == True: | |
91 | t -= 5*60*60 |
|
92 | t -= 5*60*60 | |
92 |
|
||||
93 | if plot['metadata']['localtime'] == True: |
|
|||
94 | data_time = detail['last_time'] + 5*60*60 |
|
93 | data_time = detail['last_time'] + 5*60*60 | |
95 |
|
94 | |||
96 | message = { |
|
95 | message = { | |
@@ -100,13 +99,13 def check_times(): | |||||
100 |
|
99 | |||
101 | if (t-detail['last_time']) > 10*60: |
|
100 | if (t-detail['last_time']) > 10*60: | |
102 | value = 'danger' |
|
101 | value = 'danger' | |
103 | print(('{} {} {} {} {}'.format(code, t, detail['last_time'], (t-detail['last_time']), 'offline'))) |
|
|||
104 | elif (t-detail['last_time']) > 5*60: |
|
102 | elif (t-detail['last_time']) > 5*60: | |
105 | value = 'warning' |
|
103 | value = 'warning' | |
106 | print(('{} {} {} {} {}'.format(code, t, detail['last_time'], (t-detail['last_time']), 'delayed'))) |
|
|||
107 | else: |
|
104 | else: | |
108 | value = 'success' |
|
105 | value = 'success' | |
109 |
|
106 | |||
|
107 | print(('{} {} {} {} {}'.format(code, t, detail['last_time'], (t-detail['last_time']), value))) | |||
|
108 | ||||
110 | message['value'] = value |
|
109 | message['value'] = value | |
111 |
|
110 | |||
112 | async_to_sync(channel.group_send)( |
|
111 | async_to_sync(channel.group_send)( | |
@@ -117,7 +116,7 def check_times(): | |||||
117 | } |
|
116 | } | |
118 | ) |
|
117 | ) | |
119 |
|
118 | |||
120 |
time.sleep( |
|
119 | time.sleep(60) | |
121 |
|
120 | |||
122 | def main(): |
|
121 | def main(): | |
123 | print('Starting ZMQ server...') |
|
122 | print('Starting ZMQ server...') | |
@@ -140,30 +139,27 def main(): | |||||
140 | continue |
|
139 | continue | |
141 | if not update(buffer): |
|
140 | if not update(buffer): | |
142 | receiver.send_string('ok') |
|
141 | receiver.send_string('ok') | |
|
142 | print('Queeee paso!!!') | |||
143 | continue |
|
143 | continue | |
144 | # for plot in buffer['data']: |
|
144 | ||
145 | # dum = buffer.copy() |
|
145 | buffer['time'] = [buffer['time']] | |
146 | # dum['time'] = [buffer['time']] |
|
146 | group = '{}_{}'.format( | |
147 | # if plot=='noise': |
|
147 | buffer['code'], | |
148 | # dum[plot] = [[x] for x in buffer['data'][plot]] |
|
148 | buffer['plot'].replace(' ', '_').lower() | |
149 | # elif plot=='spc': |
|
149 | ) | |
150 | # dum['noise'] = [[x] for x in buffer['data']['noise']] |
|
150 | async_to_sync(channel.group_send)( | |
151 | # dum['spc'] = buffer['data']['spc'] |
|
151 | group, | |
152 | # dum['rti'] = buffer['data']['rti'] |
|
152 | { | |
153 | # else: |
|
153 | 'type': 'zmq_message', | |
154 | # dum[plot] = buffer['data'][plot] |
|
154 | 'message': simplejson.dumps(buffer, ignore_nan=True) | |
155 | # dum.pop('data') |
|
155 | } | |
156 | # exp_code = dum.pop('exp_code') |
|
156 | ) | |
157 | # group = '{}_{}'.format(exp_code, plot) |
|
157 | ||
158 | # async_to_sync(channel.group_send)( |
|
158 | print('Sending to group {}_{} - {} bytes'.format( | |
159 | # group, |
|
159 | buffer['code'], | |
160 | # { |
|
160 | buffer['plot'].replace(' ', '_').lower(), | |
161 | # 'type': 'zmq_message', |
|
161 | len(str(buffer))) | |
162 | # 'message': simplejson.dumps(dum, ignore_nan=True) |
|
162 | ) | |
163 | # } |
|
|||
164 | # ) |
|
|||
165 |
|
||||
166 | # print('Sending to group {}_{} - {} bytes'.format(exp_code, plot, len(str(dum)))) |
|
|||
167 |
|
163 | |||
168 | receiver.send_string('ok') |
|
164 | receiver.send_string('ok') | |
169 |
|
165 |
General Comments 0
You need to be logged in to leave comments.
Login now