m0n0lithic icon

Emas1.py

m0n0lithic | PRO | 04/21/14 05:18:38 PM UTC | 0 ⭐ | 257 👁️ | Never ⏰ | []
Python |

13.71 KB

|

None

|

0 👍

/

0 👎

#! /usr/bin/env python
 
import MySQLdb
import ftplib
#import numpy as n
import pylab as p
import datetime
#import math    
from time import localtime #,mktime,strftime
from matplotlib.ticker import OldScalarFormatter, FuncFormatter
import matplotlib.text
class EMAS_DB:
 
     db = None #inicializa la variable para el manejo de la conexion a la BD
     def __init__(self):
        try:
 
           self.db = MySQLdb.connect(user='root', passwd='lenercabeza', db='BD_Emas')
           #self.db = MySQLdb.connect(host='172.25.1.16', user='root', passwd='jupAja02', db='BD_Emas')
           self.cur = self.db.cursor(MySQLdb.cursors.DictCursor)
 
        except MySQLdb.Error, (errno, strerror):
                print "(%s): %s" % (errno, strerror)
 
     def verificar(self, ID, sensor, fecha):
 
                str_ = "SELECT ID, sensor, fecha FROM datos_EMAS WHERE ID = %s AND sensor = %s AND fecha = %s"
                self.cur.execute(str_, (ID, sensor, fecha))
                resl = self.cur.fetchone()              #fetch the query
                if resl:
                   return True
                else: return False
 
     def insertar(self, ID, sensor, fecha, dato):
 
        str_ = "INSERT INTO datos_EMAS VALUES (%s, %s, %s, %s)"
        self.cur.execute(str_, (ID, sensor, fecha, dato))
 
     def obtener(self, ID, sensor, fecha):
 
        tiempo = []
        valor = []
        if sensor == '0068' or sensor == '0255':
          str_ = "SELECT ID, sensor, fecha, valor FROM datos_EMAS WHERE ID = %s AND sensor = %s AND fecha <= %s ORDER BY fecha DESC LIMIT 24"
 
          self.cur.execute(str_, (ID, sensor, fecha ))
          while True:
              row_ = self.cur.fetchone()
              if row_:
                 fechReg = row_['fecha']
                 tiempo.append(fechReg)
                 valor.append(round(row_['valor'], 2))
 
 
              else: break
          tiempo.reverse()
          valor.reverse()
          tiempo = p.array(tiempo)
          #print tiempo
          #print valor  
        else:
 
          str_ = "SELECT ID, sensor, fecha, valor FROM datos_EMAS WHERE ID = %s AND sensor = %s AND fecha <= %s AND (RIGHT(fecha,5)) = '50:00' ORDER BY fecha DESC LIMIT 24"
 
          self.cur.execute(str_, (ID, sensor, fecha ))
          while True:
              row_ = self.cur.fetchone()
              if row_:
                 fechReg = row_['fecha']
                 tiempo.append(fechReg)
                 valor.append(round(row_['valor'], 2))
 
 
 
              else: break
          tiempo.reverse()
          valor.reverse()
          tiempo = p.array(tiempo)
          #print tiempo
          #print valor  
        return tiempo, valor
 
 
 
 
     def close(self):
        self.cur.close()
        self.db.close()
 
class Grafica:
 
     def __init__(self, datos, tipo, sensor, est, unidad):
 
 
         p.rcParams['legend.fontsize'] = 9.5
         locFmt = p.DateFormatter('%m/%d %H:00')
 
         now = localtime()
         hoy = str(now[0]) +'-'+ str(now[1]).zfill(2)+'-'+ str(now[2]).zfill(2)
 
         if sensor == '0240':
 
 
            ax = p.subplot(111)
            arrFecha = datos[0]
            arrValor = datos[1]
 
            ciudad = BuscarCiudad(est)
            pos_Anota = valorMaximo(sensor,arrValor)
            anota = select_Anotacion(sensor,arrValor)
            rang = ConversionFecha(arrFecha)
 
            p.ylabel(tipo +' ('+ unidad+')', color='b')
            p.title(tipo+'\n'+ciudad+'  '+'Fecha: '+hoy, size=14, color='#aaaaaa')
            #p.set_xticks(array(range(0, size(arrFecha))) + 0.35)
            p.plot(arrFecha, arrValor)
 
            p.xlabel('Tiempo 24 horas'+'\n'+'(mes/dia hora)', color='#aaaaaa')
 
            #p.ylim((min(arrValor),max(arrValor))) 
 
 
 
            if max(arrValor) == 0:
              p.axis([min(arrFecha), max(arrFecha), min(arrValor), max(arrValor)+1])
              p.text(0.5, 0.5,'no se registran datos hasta el momento',horizontalalignment='center',verticalalignment='center',  transform = ax.transAxes, size=14, color='blue')
 
            else:
              p.axis([min(arrFecha), max(arrFecha), min(arrValor)-0.5, max(arrValor)+0.5])
              p.text(0.1, -0.08,anota[0]+':'+str(anota[1]),horizontalalignment='center',verticalalignment='center',  transform = ax.transAxes, bbox=dict(facecolor='red', alpha=0.5), size=9)
 
 
            loc = p.HourLocator(byhour=range(min(rang), max(rang), 4))
            ax.xaxis.set_major_locator(loc)
            ax.xaxis.set_major_formatter(locFmt)
            ax.yaxis.set_major_formatter(OldScalarFormatter())
            lbx = ax.get_xticklabels()
            lby = ax.get_yticklabels()
            p.setp(lbx, fontsize=8, color='#aaaaaa')
            p.setp(lby, fontsize=8, color='b')
 
            fich=tipo[0:4]+est[8:]
            p.grid(True)
            p.savefig(fich+'.png')
            p.close()
            #p.show()
         if sensor == '0068' or sensor == '0255':
 
           ax = p.subplot(111)
           arrFecha = datos[0]
           arrValor = datos[1]
           rang = ConversionFecha(arrFecha)
 
           ciudad = BuscarCiudad(est)
           pos_Anota = valorMaximo(sensor,arrValor)
           anota = select_Anotacion(sensor,arrValor)
           #print arrFecha
           #print arrValor
 
 
           p.ylabel(tipo +' ('+ unidad+')', color='b')
           p.title(tipo+'\n'+ciudad+'  '+'Fecha: '+hoy, size=14, color='#aaaaaa')
 
 
 
           line, =  p.plot(arrFecha, arrValor)
           line.set_color('b')
           #line.set_marker('o')
           #yloc=range(min(arrValor), max(arrValor), 2)
           #p.yticks(range(min(arrValor), max(arrValor), 1.2))
           loc = p.HourLocator(byhour=range(min(rang), max(rang), 4))
           #loc = p.HourLocator(byhour=range(0,23,6))
           p.axis([min(arrFecha), max(arrFecha), min(arrValor)-0.5, max(arrValor)+0.5])
           #ax.yaxis.set_major_locator(yloc)
           ax.xaxis.set_major_locator(loc)
           ax.xaxis.set_major_formatter(locFmt)
           ax.yaxis.set_major_formatter(OldScalarFormatter())
           ax.annotate(str(pos_Anota[2]), xy=(arrFecha[pos_Anota[0]], pos_Anota[1]), size=10, color='r')
           p.text(0.1, -0.08,anota[0]+':'+str(anota[1]),horizontalalignment='center',verticalalignment='center',  transform = ax.transAxes, bbox=dict(facecolor='red', alpha=0.5), size=9)
 
           #ax.annotate(tipo+' '+anota+':'+str(max(arrValor)), xy=(arrFecha[pos_Anota[0]], max(arrValor)), xytext=(arrFecha[pos_Anota[1]], max(arrValor)+0.5), arrowprops=dict(facecolor='red', shrink=0.03), size=10, color='r')
           lbx = ax.get_xticklabels()
           p.xlabel('Tiempo 24 horas'+'\n'+'(mes/dia hora)', color='#aaaaaa')
           lby = ax.get_yticklabels()
           #p.ylim((min(arrValor),max(arrValor))) 
           p.setp(lbx, fontsize=8, color='#aaaaaa')
           p.setp(lby, fontsize=8, color='b')
 
 
           #p.text(max(arrFecha)+.05, max(arrFecha), r'$\bar H_{20.0}$' ,fontsize=12)
           #p.legend(nota ,'maxima', loc='best')
           fich=tipo[0:4]+est[8:]
           p.grid(True)
           p.savefig(fich+'.png')
           p.close()
           #p.show()
         if sensor == '0104':
 
           ax = p.subplot(111)
 
           list1 = datos[0]
           list2 = datos[1]
           ciudad = BuscarCiudad(est)
 
           p.ylabel('velocidad (nudos)', color='b')
           #p.grid(True)
           p.title(tipo+' del viento'+'\n'+ciudad+'  '+'Fecha:'+hoy,size=14,weight='bold', color='#aaaaaa')
 
           arrFecha = list1[0]
           arrValor = list1[1]
 
           rang = ConversionFecha(arrFecha)
 
           lineV, = p.plot(arrFecha, arrValor)
           lineV.set_color('b')
           lineV.set_markersize(5)
           lineV.set_linestyle('-')
           lineV.set_markerfacecolor('b')
 
 
           #ax.axis([min(arrFecha), max(arrFecha), min(arrValor)-0.5, max(arrValor)+0.5])
           #ax.xaxis.set_major_locator(loc)
           ax.xaxis.set_major_formatter(locFmt)
           lbx = ax.get_xticklabels()
           lby = ax.get_yticklabels()
           p.setp(lbx, fontsize=8, color='#aaaaaa')
           p.xlabel('Tiempo 24 horas'+'\n'+'(mes/dia hora)', color='#aaaaaa')
           p.setp(lby, fontsize=8, color='b')
 
 
           ax2 = p.twinx()
 
           arrFecha1 = list2[0]
           arrValor1 = list2[1]
 
 
 
           p.ylabel('Direccion (Grados)', color='r')
 
           lineD, = p.plot(arrFecha1, arrValor1)
           lineD.set_color('r')
           lineD.set_markersize(5)
           lineD.set_linestyle('--')
           lineD.set_markerfacecolor('r')
 
 
 
 
 
           #loc = p.HourLocator(byhour=range(0,23,6))
           loc = p.HourLocator(byhour=range(min(rang), max(rang), 4))
           p.axis([min(arrFecha1), max(arrFecha1), min(arrValor1), max(arrValor1)])
 
           ax2.xaxis.set_major_locator(loc)
           ax2.xaxis.set_major_formatter(locFmt)
           lbx = ax2.get_xticklabels()
           lby = ax2.get_yticklabels()
           p.setp(lbx, fontsize=8, color='#aaaaaa')
           p.xlabel('Tiempo 24 horas'+'\n'+'(mes/dia hora)', color='#aaaaaa')
           p.setp(lby, fontsize=8, color='r')
 
           p.legend((lineD,lineV),('Direccion','Velocidad'), loc='best')
           #p.show()
           fich=tipo[0:4]+est[8:]
           p.grid(True)
           p.savefig(fich+'.png') #,dpi=70
           p.close()
           #print arrFecha1
           #print arrValor1
def select_Anotacion(sens,listV):
    num = 0.0
    if max(listV)== 0:
          anota = 'no registra datos'
    else :
       if sens == '0068':
          anota = 'maxima temperatura en las ultimas 24 horas'
          num = max(listV)
       if sens == '0255':
          anota = 'minima presion en las ultimas 24 horas'
          num = min(listV)
       if sens == '0240':
          anota = 'max_precipitacion en las ultimas 24 horas'
          num = max(listV)
    return anota, num
def valorMaximo(sens,listV):
#esta funcion es buscar la mejor posicion de la anotacion para avisar el valor maximo o minimo de las graficas
   if sens != '0255':
     valor = max(listV)
     posicion_Y=valor
     posicion = 0
     for pV in listV:
        if pV == valor:
           break
        posicion = posicion+1
     #if posicion >= 8:
      #  posiciontexto_X=posicion-1 
     #else: posiciontexto_X = posicion+1
   else:
     valor = min(listV)
     posicion_Y=valor-0.1
     posicion = 0
     for pV in listV:
        if pV == valor:
           break
        posicion = posicion+1
     #if posicion >= 8:
        #posiciontexto_X=posicion-1 
     #else: posiciontexto_X = posicion+1       
   return posicion,posicion_Y, valor
 
def BuscarCiudad(est):
    ciudad = 'Covenas'
    if est == '0000000001':
       ciudad = 'Covenas'
    if est == '0000000002':
       ciudad = 'Mantuntugo'
    if est == '0000000003':
       ciudad = 'Providencia'
 
    return ciudad
 
 
def ConversionFecha(fechas):
    rango = []
    hora = []
    for dfecha in fechas:
        hora.append(str(dfecha)[11:13])
 
    for sfecha in hora:
        rango.append(int(sfecha))
    return rango
 
def CapturarDATOS(archMIS, Cnx):
     #escanea los ficheros .MIS para extraer sus datos  
    fn = open(archMIS, 'r')
 
    while True:
     line = fn.readline().split('\t')
     ta = len(line[0])
     #print ta
     #print line
     if len(line[0])!= 0:
        if len(line[0])==85:
          ID = line[0][9:19]
 
          Sensor=line[0][37:41]
          #print ID
          #print Sensor
        else:
          fecha = line[0][0:4]+'-'+line[0][4:6]+'-'+line[0][6:8]+' '+line[0][9:17]
          dato = line[0][18:]
          if not Cnx.verificar(ID, Sensor, fecha):
            Cnx.insertar(ID,Sensor,fecha, dato)
     else: break
 
 
def DescargaFTP(hoy):
    #descarga los ficheros .MIS por via FTP
    Emas = ['CB144456','CB1462BA','CB145720']
    try:
 
     ftp = ftplib.FTP("172.25.19.17")
     ftp.login(user="cioh", passwd="lenercabeza")
     ftp.cwd(hoy)
     Cnx = EMAS_DB()
     for ID in Emas:
 
       ftpfile = ftp.nlst(ID + ' ' + hoy + '*')
       for archMIS in ftpfile:
           ftp.retrbinary('RETR ' + archMIS, open(archMIS,'wb').write)
           #ftpfile.append('CB144456 20100121 065149359' + '.MIS')      
           CapturarDATOS(archMIS, Cnx)
     Cnx.close()
    except ftplib.error_perm, (error):
                print "Error en la conexion: %s" % (error)
 
 
 
if __name__ == '__main__':
 
     now = localtime()
     hoy = str(now[0]) + str(now[1]).zfill(2) + str(now[2]).zfill(2)
     ahora = str(now[0]) +'-'+str(now[1]).zfill(2) +'-'+ str(now[2]).zfill(2)+' '+str(now[3]).zfill(2)+':'+str(now[4]).zfill(2)
     #print hoy
     DescargaFTP(hoy)
     listas = []
     estaciones=['0000000001','0000000002','0000000003']
     sensor = ['0068','0240','0255','0104']
     Cnx = EMAS_DB()
     for est in estaciones:
       for sen in sensor:
 
        if sen == '0104':
 
          datos = Cnx.obtener(est, '0103', ahora)
          dato1 = Cnx.obtener(est, '0104', ahora)
          listas = datos, dato1
          tipo = 'Direccion y velocidad'
          unid = 'gn'
          grf = Grafica(listas, tipo, sen, est, unid)
        else:
          datos = Cnx.obtener(est, sen, ahora)
          if sen == '0068':
           tipo = 'Temperatura'
           unid = 'Grado Celsius'
           grf1 = Grafica(datos, tipo, sen, est, unid)
          if sen == '0255':
           tipo = 'Presion Atmosferica'
           unid = 'mb'
           grf2 = Grafica(datos, tipo, sen, est, unid)
          if sen == '0240':
           tipo = 'Precipitacion'
           unid = 'milimetros'
           grf3 = Grafica(datos, tipo, sen, est, unid)
     Cnx.close()

Comments