#!/usr/bin/python # -*- coding: UTF-8 -*- import os import json import simplejson from datetime import datetime, timedelta import numpy from pymongo import MongoClient # import mongoengine from asgiref.sync import async_to_sync from channels.generic.websocket import WebsocketConsumer # from plotter.models import Experiment, ExpDetail, PlotMeta, PlotData # Here we create the db named "dbplots" host = os.environ.get('HOST_MONGO', 'localhost') # mongoengine.connect('dbplots', host=host, port=27017) CLIENT = MongoClient('{}:27017'.format(host)) DB = CLIENT['dbplots'] 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'] 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 }) if det1: meta1 = DB.plot_meta.find_one({ 'exp_detail': det1['_id'], 'plot': plot }) if meta1: if meta1['metadata']['type'] in ('pcolor',): datas = DB.plot_data.find( {'plot': meta1['_id']}, ['time', 'data'], sort=[('time', -1)], limit=1)[0] ret['time'] = [datas['time']] ret['data'] = datas['data'] ret['metadata'] = meta1['metadata'] else: last = det1['last_time'] metas = [meta1['_id']] if det0: meta0 = DB.plot_meta.find_one({ 'exp_detail': det0['_id'], 'plot': plot }) if meta0: 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) dum = [(d['time'], d['data']) for d in datas] ret['time'] = [d[0] for d in dum] dum = numpy.array([d[1] for d in dum]) 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())))] ret['metadata'] = meta1['metadata'] self.send(simplejson.dumps(ret, ignore_nan=True)) else: self.send(json.dumps({'interval': 0})) def zmq_message(self, event): # Send message to WebSocket self.send(text_data=event['message'])