diff --git a/schainpy/model/utils/__init__.py b/schainpy/model/utils/__init__.py index 12809e0..f8ea804 100644 --- a/schainpy/model/utils/__init__.py +++ b/schainpy/model/utils/__init__.py @@ -4,4 +4,5 @@ $Author: murco $ $Id: Processor.py 1 2012-11-12 18:56:07Z murco $ ''' -from jroutils_ftp import * \ No newline at end of file +from jroutils_ftp import * +from jroutils_publish import PublishData \ No newline at end of file diff --git a/schainpy/model/utils/jroutils_publish.py b/schainpy/model/utils/jroutils_publish.py new file mode 100644 index 0000000..2007f9c --- /dev/null +++ b/schainpy/model/utils/jroutils_publish.py @@ -0,0 +1,102 @@ +''' +@author: Juan C. Espinoza +''' + +import time +import json +import numpy +import paho.mqtt.client as mqtt + +from schainpy.model.proc.jroproc_base import Operation + + +class PrettyFloat(float): + def __repr__(self): + return '%.2f' % self + +def pretty_floats(obj): + if isinstance(obj, float): + return PrettyFloat(obj) + elif isinstance(obj, dict): + return dict((k, pretty_floats(v)) for k, v in obj.items()) + elif isinstance(obj, (list, tuple)): + return map(pretty_floats, obj) + return obj + +class PublishData(Operation): + + __MAXNUMX = 80 + __MAXNUMY = 80 + + def __init__(self): + + Operation.__init__(self) + + self.isConfig = False + self.client = None + + @staticmethod + def on_disconnect(client, userdata, rc): + if rc != 0: + print("Unexpected disconnection.") + + def setup(self, host, port=1883, username=None, password=None, **kwargs): + + self.client = mqtt.Client() + try: + self.client.connect(host=host, port=port, keepalive=60*10, bind_address='') + except: + self.client = False + self.topic = kwargs.get('topic', 'schain') + self.delay = kwargs.get('delay', 0) + self.host = host + self.port = port + self.cnt = 0 + + def run(self, dataOut, host, datatype='data_spc', **kwargs): + + if not self.isConfig: + self.setup(host, **kwargs) + self.isConfig = True + + data = getattr(dataOut, datatype) + + z = data/dataOut.normFactor + zdB = 10*numpy.log10(z) + avg = numpy.average(z, axis=1) + avgdB = 10*numpy.log10(avg) + + xlen ,ylen = zdB[0].shape + + + dx = numpy.floor(xlen/self.__MAXNUMX) + 1 + dy = numpy.floor(ylen/self.__MAXNUMY) + 1 + + Z = [0 for i in dataOut.channelList] + AVG = [0 for i in dataOut.channelList] + + for i in dataOut.channelList: + Z[i] = zdB[i][::dx, ::dy].tolist() + AVG[i] = avgdB[i][::dy].tolist() + + payload = {'timestamp':dataOut.utctime, + 'data':pretty_floats(Z), + 'data_profile':pretty_floats(AVG), + 'channels': ['Ch %s' % ch for ch in dataOut.channelList], + 'interval': dataOut.getTimeInterval(), + } + + + #if self.cnt==self.interval and self.client: + print 'Publishing data to {}'.format(self.host) + self.client.publish(self.topic, json.dumps(payload), qos=0) + time.sleep(self.delay) + #self.cnt = 0 + #else: + # self.cnt += 1 + + + def close(self): + + if self.client: + self.client.disconnect() \ No newline at end of file