import mysql.connector import numpy as np import matplotlib.pyplot as plt from datetime import date import seaborn import time from time import localtime import os ''' Programa que maneja os histogramas, faz a atualização deles com dados do mysql de um usuario específico. Possui o mecanismo de comunicação com o site, quando ocorrer um erro irá aparecer um card vermelho no final do site ''' ############ argumentos ############ user_sql= "bruno" # usuario do detector que serão usados os dados output= 'graficododia.png' # nome do arquivo histograma minutos= 30 # tamanho do bin dormir= 2*60 # tempo que o programa dorme para acumular mais dados em segundos Eventos= "Eventos/"+str(minutos)+"min" # titulo de y do histograma ############ Funções ############ def dateiniciofim(): #função que dá a hora do inicio e final do dia atual em segundos da epoch listA=list(localtime()) listB=list(localtime()) for i in range (3,6):#posições que são zero listA[i]=0 # zerando hora minuto segundo if i==3: listB[i]=23 #23 horas elif i==4: listB[i]=59 #23 min else: listB[i]=60 #60 seg datainicial = tuple(listA) datafinal = tuple(listB) return((time.mktime(datainicial),time.mktime(datafinal))) def manejo_pasta(file): nome=date.today().strftime("histograma%d%m%Y") os.rename(file,f'/home/brunoz31/graficos/{nome}') def mensagem_sql(usuario, tempo): horas_grafico= 24 where= tempo*1000 mensagem=f'select hora from eventos where hora >= {where} and usuario="{usuario}";' return(mensagem) def plot_dist(data, x_label, y_label, tittle, number_bins, plot_output): """ Args: data (list): List with data to be plotted. x_label (str): Plot x-label. y_label (str): Plot y-label. tittle (str): Plot tittle. number_bins (int): Number of bins for distribution. plot_output (str): Path to plot output. """ plt.xlim([0, 24]) seaborn.set(color_codes='dark') seaborn.set_style("white") plt.figure(1, figsize=(9, 6)) plt.xticks(np.arange(0, 25, 1.0)) sns_plot = seaborn.histplot(data, bins=number_bins, color="#5881C1") sns_plot.set(xlabel=x_label, ylabel=y_label) plt.title(tittle) sns_plot.figure.savefig(plot_output, bbox_inches='tight', dpi=400) plt.show() plt.close() def trocatexto(nomefile,outword, inword): ''' Programa que recebe um arquivo e substitui uma palavra por outra e escreve novamente no arquivo Args: nomefile (str): nome do arquivo que será modificado outword (str): palavra que será procurada no arquivo para ser substituida inword (str): pela pela qual a outword será substituida ''' with open(nomefile,"r") as arquivo: #abre sem apagar o arquivo lido = arquivo.read() # lê o arquivo armazenado em nomefile mudado = lido.replace(outword,inword) #troca a str em outword pelo str em inword with open(nomefile,"w") as arqu: #apaga texto do arquivo arqu.write(mudado) # escreve novo com as palavras trocadas def erro(html): # func with open(html,"r") as arquivo: #abre sem apagar o arquivo lido = arquivo.read() # lê o arquivo armazenado em nomefile string_erro = lido[10584:-25] return(string_erro) ############ loop principal ############ endereco_html = "/var/www/html/testou.html" trocatexto(endereco_html,"verme","verde") trocatexto(endereco_html,erro(endereco_html),"ok") tempo_inicial , tempo_final= dateiniciofim() #começo e fim do dia que o programa rodou tempo_sql = tempo_inicial # para que haja seleção de dados antes da meia noite anterior try: while True: ##### troca de dia ##### if time.time() > tempo_final: manejo_pasta(output)# manda o histograma para a pasta graficos quando passa da meia noite tempo_inicial , tempo_final= dateiniciofim() #novo tempo inical e final tempo_sql = tempo_inicial # tempo utilizado para consulta sql atualizado ##### Recebe os dados ##### db_connection = mysql.connector.connect( # Conectando ao sql host='localhost', user='user', passwd='pass', auth_plugin='mysql_native_password' ) cur = db_connection.cursor() # Create a Cursor object to execute queries. cur.execute("USE COSMICPAMPA;") # Seleciona banco de dados previamento criado a ser usado. mensagem = mensagem_sql(user_sql,tempo_sql) # comando sql que será executado cur.execute(mensagem) # executa o comando sql dados = np.array([],dtype=float) # vetor que armazena os dados em ms for row in cur.fetchall(): dados= np.append(dados,row) extensaodehoras = (dados[-1] - dados[0])/(1000*60*60) # usado para que o número de bins creçam conforme a chegada de mais dados for i in range(0,len(dados)): dados[i]= (dados[i] - tempo_inicial*1000)/(1000*60*60) # transformando os dados em horas ##### histograma ##### today = date.today()# Data para o título d1 = today.strftime("%A %d/%b/%Y") bins=int(extensaodehoras*2) if bins < 1: # para garantir que haja sempre pelo menos um bin bins=1 plot_dist(dados, "Horas", Eventos, d1, bins, output) # pausa de 1 minutos no loop para chegar novos dados time.sleep(dormir) except Exception as e: trocatexto(endereco_html,"verde","verme") trocatexto(endereco_html,"ok",f"O erro foi {e} no programa grafico.py")