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 data_inicio_fim(): ''' 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 # horas elif i==4: listB[i]=59 # min else: listB[i]=60 # seg datainicial = tuple(listA) datafinal = tuple(listB) return((time.mktime(datainicial),time.mktime(datafinal))) def manejo_pasta(file): ''' Função que leva o arquivo file para posição '/home/brunoz31/graficos/' Exemplo de nome: histograma27082021 ''' nome=date.today().strftime("histograma%d%m%Y") os.rename(file,f'/home/brunoz31/graficos/{nome}') def mensagem_sql(usuario, tempo): ''' Função que retorna a mensagem de sql para seleção de dados de um usuario que chegaram depois de um tempo ''' where= tempo*1000 # em ms 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 troca_texto(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): ''' Função que encontra o erro tem que ser atualizado no html toda vez que muda o html tem que mudar a posição 10584:-25 ''' 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" troca_texto(endereco_html,"verme","verde") troca_texto(endereco_html,erro(endereco_html),"ok") tempo_inicial , tempo_final= data_inicio_fim() #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= data_inicio_fim() #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='password', 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(): # coloca os dados de tempo do mysql no array dados dados= np.append(dados,row) if dados.size > 0: # se houver 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 else: dados= np.append(dados,-10) extensaodehoras = (dados[-1] - dados[0])/(1000*60*60) ##### histograma ##### today = date.today()# Data para o título d1 = today.strftime("%A %d/%b/%Y") bins=round(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: troca_texto(endereco_html,"verde","verme") troca_texto(endereco_html,"ok",f"O erro foi {e} no programa grafico.py")