##// END OF EJS Templates
Fix breadcrum in header
Fix breadcrum in header

File last commit:

r33:4f7855132c5d
r43:8d16e1ab9977
Show More
consumers.py
138 lines | 4.5 KiB | text/x-python | PythonLexer
Developer
New version with cards and status alerts
r11 #!/usr/bin/python
# -*- coding: UTF-8 -*-
Juan C. Espinoza
Docker working
r1 import os
First version RTI, Spectra, Noise + Docker
r0 import json
Juan C. Espinoza
Update jroplots.js
r31 import simplejson
Juan C. Espinoza
New template, clean code, workig for realtime
r21 from datetime import datetime, timedelta
Juan C. Espinoza
Test version ready
r27 import numpy
First version RTI, Spectra, Noise + Docker
r0 from pymongo import MongoClient
Juan C. Espinoza
Use pymongo instead of mongoengine to improve query performance
r33 # import mongoengine
Juan C. Espinoza
Test Version
r22 from asgiref.sync import async_to_sync
from channels.generic.websocket import WebsocketConsumer
Juan C. Espinoza
Use pymongo instead of mongoengine to improve query performance
r33 # from plotter.models import Experiment, ExpDetail, PlotMeta, PlotData
First version RTI, Spectra, Noise + Docker
r0
Developer
New version with cards and status alerts
r11 # Here we create the db named "dbplots"
Juan C. Espinoza
Docker working
r1 host = os.environ.get('HOST_MONGO', 'localhost')
Juan C. Espinoza
Use pymongo instead of mongoengine to improve query performance
r33 # mongoengine.connect('dbplots', host=host, port=27017)
Juan C. Espinoza
Test Version
r22
Juan C. Espinoza
Use pymongo instead of mongoengine to improve query performance
r33 CLIENT = MongoClient('{}:27017'.format(host))
DB = CLIENT['dbplots']
Juan C. Espinoza
Test Version
r22
class MainConsumer(WebsocketConsumer):
def connect(self):
self.group_name = 'main'
async_to_sync(self.channel_layer.group_add)(
self.group_name,
self.channel_name
)
self.accept()
def disconnect(self, close_code):
async_to_sync(self.channel_layer.group_discard)(
self.group_name,
self.channel_name
)
def receive(self, text_data):
pass
def zmq_message(self, event):
# Send message to WebSocket
self.send(text_data=event['message'])
class PlotConsumer(WebsocketConsumer):
def connect(self):
if 'realtime' in self.scope['path']:
self.realtime = True
self.group_name = '{}_{}'.format(
self.scope['url_route']['kwargs']['code'],
self.scope['url_route']['kwargs']['plot'],
)
async_to_sync(self.channel_layer.group_add)(
self.group_name,
self.channel_name
)
else:
self.realtime = False
self.accept()
def disconnect(self, close_code):
if self.realtime:
async_to_sync(self.channel_layer.group_discard)(
self.group_name,
self.channel_name
)
def receive(self, text_data):
ret = {}
dt = datetime.strptime(text_data, '%d-%m-%Y')
code = self.scope['url_route']['kwargs']['code']
plot = self.scope['url_route']['kwargs']['plot']
Juan C. Espinoza
Use pymongo instead of mongoengine to improve query performance
r33 exp = DB.experiment.find_one({'code': int(code)})
det0 = DB.exp_detail.find_one({
'experiment': exp['_id'],
'date': dt-timedelta(days=1)
})
det1 = DB.exp_detail.find_one({
'experiment': exp['_id'],
'date': dt
})
Juan C. Espinoza
Test Version
r22
if det1:
Juan C. Espinoza
Use pymongo instead of mongoengine to improve query performance
r33 meta1 = DB.plot_meta.find_one({
'exp_detail': det1['_id'],
'plot': plot
})
Juan C. Espinoza
Test Version
r22 if meta1:
Juan C. Espinoza
Use pymongo instead of mongoengine to improve query performance
r33 if meta1['metadata']['type'] in ('pcolor',):
datas = DB.plot_data.find(
{'plot': meta1['_id']},
['time', 'data'],
sort=[('time', -1)],
limit=1)[0]
Juan C. Espinoza
Test Version
r22 ret['time'] = [datas['time']]
Juan C. Espinoza
Test version ready
r27 ret['data'] = datas['data']
Juan C. Espinoza
Use pymongo instead of mongoengine to improve query performance
r33 ret['metadata'] = meta1['metadata']
Juan C. Espinoza
Test Version
r22 else:
Juan C. Espinoza
Use pymongo instead of mongoengine to improve query performance
r33 last = det1['last_time']
metas = [meta1['_id']]
Juan C. Espinoza
Test Version
r22 if det0:
Juan C. Espinoza
Use pymongo instead of mongoengine to improve query performance
r33 meta0 = DB.plot_meta.find_one({
'exp_detail': det0['_id'],
'plot': plot
})
Juan C. Espinoza
Test Version
r22 if meta0:
Juan C. Espinoza
Use pymongo instead of mongoengine to improve query performance
r33 metas.append(meta0['_id'])
total = DB.plot_data.count_documents({
'plot': {'$in': metas},
'time': {'$gt': last-12*60*60}
})
skip = 0 if total-720<0 else total-720
datas = DB.plot_data.find({
'plot': {'$in': metas},
'time': {'$gt': last-12*60*60}
}, ['time', 'data'], sort=[('time', 1)], limit=720, skip=skip)
Juan C. Espinoza
Test Version
r22 dum = [(d['time'], d['data']) for d in datas]
ret['time'] = [d[0] for d in dum]
Juan C. Espinoza
Test version ready
r27 dum = numpy.array([d[1] for d in dum])
Juan C. Espinoza
Use pymongo instead of mongoengine to improve query performance
r33
Juan C. Espinoza
Test version ready
r27 if len(dum[0][0])==1:
ret['data'] = dum.T[0].tolist()
else:
ret['data'] = [t for t in map(list, list(zip(*dum.tolist())))]
Juan C. Espinoza
Use pymongo instead of mongoengine to improve query performance
r33 ret['metadata'] = meta1['metadata']
Juan C. Espinoza
Update jroplots.js
r31 self.send(simplejson.dumps(ret, ignore_nan=True))
Juan C. Espinoza
Test Version
r22 else:
self.send(json.dumps({'interval': 0}))
def zmq_message(self, event):
# Send message to WebSocket
self.send(text_data=event['message'])