#! /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