Commits (35)
## Programa que exevuta aleatorio.py para envio de mensagem aleatórias ao servidor
clear
echo "............script started............"
d=1
while [ true ]
do
result=`python3 aleatorio.py`
mosquitto_pub -h 116.203.152.149 -t cosmic -u user -P password -m "$result"
echo "$d $result"
((d++)) ## para que seja printado qual o numero da mensagem enviada
done
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")
#!/usr/bin/env python3
'''
Programa que roda até ser encerrado (ctrl+c) checando por erros as mensagens recebidas
pelo tópico "cosmic" por mqtt e salvando-as na database COSMICPAMPA tabela eventos
A saúde do programa pode ser checada por:
* Arquivo log: cat log_inicial.dat
* Tópico mqtt feedback: mosquitto_sub -h localhost -t feedback -P cta -u cta
* Flag no site: http://sandbox.cosmicpampa.cc/testou.html
* Ela ficará vermelha caso o programa pare de funcionar
'''
import paho.mqtt.client as mqtt
import hashlib
import mysql.connector
from datetime import datetime
############ argumentos ############
global cur
endereco_html = "/var/www/html/testou.html"
broker_address="localhost"
topico= "cosmic" #Topico mqtt
username_MQTT="cta" #user para MQTT
password_MQTT="cta" #senha para MQTT
output= 'log_inicial.dat' #Arquivo log
user_db = 'user'
password_db = 'password'
############ funções ############
def check_usuario():
cur.execute("USE COSMICPAMPA;")
cur.execute('select user from usuarios;')
return(cur.fetchall())
def insere_bd(colunas,valores):
cur.execute("USE COSMICPAMPA;")
cur.execute("INSERT INTO eventos ({}) VALUES({})".format(colunas,valores)) #Salva comando no cursor
def on_message(client, userdata, message): # Funcao que roda toda vez que se recebe uma mensagem
#### mensagens no terminal (opcional)
# print("message received " ,str(message.payload.decode("utf-8"))) #imprime msg no terminal
# print("message topic=",message.topic) # imprime tópico
# print("message qos=",message.qos)
# print("message retain flag=",message.retain)
# colocando dados em variaveis que representam as grandezas medidas
pre_dados = str(message.payload.decode("utf-8")) # transforma a mensagem recebida em string
dados = list(pre_dados.split(" ")) # separando string que chegou em uma lista por espaços
hora= float(dados[0])
loca= "'{}'".format(dados[1])
inte= float(dados[2])
temp= float(dados[3])
umid= float(dados[4])
pres= float(dados[5])
usua= "'{}'".format(dados[6])
hash= "'{}'".format(dados[7])
# começo das strings colunas e valores, desta forma só se salva no bd o que está correto
colunas="hora,local"
valores= str(hora)+","+str(loca)
today = datetime.now()
hoje = " " + today.strftime("%Y|%m|%d %H:%M:%S")
# Checa o usuario
usuarios_cadastrados = check_usuario()
for x in usuarios_cadastrados:
usuario_comparacao= str(usua)[1:-1]
cadastrado_bool = False
cadastrado_bool = usuario_comparacao == str(x)[2:-3]
if cadastrado_bool:
break
if not cadastrado_bool:
mensag = "usuario não cadastrado: "+usua
print( mensag+ str(hoje),file = open(output,'a'))
client.publish("feedback", mensag)
# Checa o Hash
string = str(hora)+str(loca)[1:-1]+str(inte)+str(temp)+str(umid)+str(pres)+usua[1:-1]
result = hashlib.md5(string.encode())
hash2 = result.hexdigest()
hash1= "{}".format(dados[7]) # hash específico para comparação, sem ''
if (hash2==hash1 and cadastrado_bool): # só manda para o BD se o HASH for igual
client.publish("feedback","dadosHASH confere")
# intensidade > 0
if (inte<0):
mensag = "intensidade menor que zero"
print( mensag+str(hoje),file = open(output,'a'))
client.publish("feedback",mensag)
else:
colunas += ",intensidade"
valores += "," + str(inte)
# Checa se temp está entre o zero absoluto e um número grande para todas escalas (C° K F°)
if (-274>temp or umid>1000):
mensag = "temperatura errada"
print( mensag+str(hoje),file = open(output,'a'))
client.publish("feedback",mensag)
else:
colunas += ",temperatura"
valores += "," + str(temp)
# Checa se umidade está entre 0% e 100%
if (0>umid or umid>100):
mensag= "umidade errada"
print( mensag+str(hoje),file = open(output,'a'))
client.publish("feedback",mensag)
else:
colunas += ",umidade"
valores += "," + str(umid)
# Pressao > 0
if (pres<=0):
mensag = "pressao menor que zero"
print( mensag+str(hoje),file = open(output,'a'))
client.publish("feedback",mensag)
else:
colunas += ",pressao"
valores += "," + str(pres)
# add valores faltam
colunas += ",usuario,HASH"
valores += ","+usua+","+hash
## Inserção no banco de dados
insere_bd(colunas,valores) #chama a função que INSERT no banco de dados
db_connection.commit() # executa o comando do curso
elif(cadastrado_bool): #caso hash não confira
mensag = "HASH diferentes hash1: "+hash1+"hash2: "+hash2
print( mensag+str(hoje),file = open(output,'a'))
client.publish("feedback", mensag)
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): # 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)
# Programa principal
try:
troca_texto(endereco_html,"verme","verde")
troca_texto(endereco_html,erro(endereco_html),"ok")
db_connection = mysql.connector.connect(host='localhost',user = user_db, passwd = password_db, auth_plugin='mysql_native_password')
cur = db_connection.cursor()
############ Subscribe ao tópico ############
client = mqtt.Client("P1") #create new instance
client.on_message = on_message #attach function to callback
client.username_pw_set(username_MQTT, password_MQTT) # passa o user e senha do mqtt
client.connect(broker_address) #connect to broker
client.subscribe(topico) # se inscreve no tópico (quando chega mensagem chama a função on_message)
client.loop_forever() # repete tudo relacionado ao mqtt
except Exception as e:
troca_texto(endereco_html,"verde","verme")
troca_texto(endereco_html,"ok",f"O erro foi {e} no programa inicial.py")
(
echo "$(date "+%d|%m|%Y %T") : Start"
python3 inicial.py
echo "ERROR"
echo "$(date "+%d%m%Y %T") : Done"
) >> log.err 2>&1
\ No newline at end of file
# programa que mantem o banco de dados conectado ao programa inicial
# mandando mensagem de duas em duas horas
clear
echo "............script started............"
while [ true ]
do
mosquitto_pub -h localhost -t cosmic -u cta -P cta -m "1628014855130.0227 EUA 18.086674587367277 -19.971164417767557 -80.06389753553181 1017.3726619898309 ocioso a9ac3337bb6f6573e8726342ca6b0fac"
echo "enviado"
sleep 2h
\ No newline at end of file
echo "Programa que executa manejografico.py que leva os graficos da pasta html para pasta graficos no home"
(
echo "$(date "+%d%m%Y %T") : Start"
python3 manejografico.py
echo "ERROR"
echo "$(date "+%d%m%Y %T") : Done"
) >> /home/brunoz31/log_manejografico.err 2>&1 ## envia para a pasta home, não é acessível ao site
## Programa que gera grafico de 100 em 100 segundos
while [ true ];
do echo "plotando...";
python3 ReadPlotdata.py;
echo "plotado";
sleep 120;
done
##
## Programa que cria uma interface de fácil
## uso para manejo da tabela usuarios
##
import mysql.connector
def insert_bd(colunas,valores):
# função para inserserção de dados no bd que recebe colunas utilizadas e valores
cur.execute("INSERT INTO usuarios ({}) VALUES({})".format(colunas,valores)) #Salva comando no cursor
db_connection.commit()
# CONEXÃO COM SQL
user_db = '[usuario_sql]'
password_db = '[senha_sql]'
db_connection = mysql.connector.connect(host='localhost',user = user_db, passwd = password_db, auth_plugin='mysql_native_password')
cur = db_connection.cursor() #cursor que recebe comandos mysql
# cur.execute("USE COSMICPAMPA") #escolhe database
# Começo
print("PROGRAMA DE USUARIOS (crtrl+c para sair) \n Opções:")
print("1. Adicionar usuario \n2. Retirar usuario \n3. Checar usuarios\n\n")
opcoes=[1,2,3] #opções de escolhas
resposta="0"
while resposta not in opcoes: #pergunta até que a resposta esteja entre 1-3
resposta = input("O que quer fazer? ")
try: # para que a resposta seja um número
resposta = int(resposta)
except ValueError:
print("Responda com um número\n")
if resposta == 1:
print("User, Nome e Pais\n")
user = input("Usuario: ")
nome = input("Nome: ")
pais = input("País: ")
valores =f"'{user}','{nome}','{pais}'"
col1 = "user, nome, pais"
print((valores,col1))
insert_bd(col1, valores)
elif resposta == 2:
cur.execute(f"select user FROM usuarios")
cadastrados= str(cur.fetchall())
print("opções: "+cadastrados)
user= 'ze$%!' # o loop só irá parar quando vier uma opção válida
while user not in cadastrados:
user = input("qual usuario deve ser retirado? ")
cur.execute(f"DELETE FROM usuarios WHERE user = '{user}'") #Deleta usuario
db_connection.commit()
else:
cur.execute(f"select * FROM usuarios")
colunas = cur.column_names
dados = cur.fetchall()
print(colunas[0]+"\t|\t"+colunas[1]+"\t|\t"+colunas[2])
print("--------------------------------------------------")
for us,nom,pai in dados:
print(str(us)+"\t|\t"+str(nom)+"\t|\t"+str(pai))
import time
import numpy as np
from numpy import random
import hashlib
# Programa que produz um sinal espaçado aleatóriamente
# A função time.time() tem output em seconds since the epoch
# Epoch pode ser checada com time.gmtime(0)
# para UNIX é January 1, 1970, 00:00:00 (UTC)
opcoes_local= ('POA','EU','EUA')
opcoes_usuario= ('bruno','maria','joao','timot')
USUA= random.choice(opcoes_usuario) #escolhe um valor aleatório das opcoes_local
LOCA= random.choice(opcoes_local)
tempo_espera = abs(np.log(1.0 - np.random.random()))
HORA= time.time()*1000 #ms
INTE= np.random.normal(20, 5) #Unidade: V
TEMP= np.random.normal(20, 0.1) #°C
UMID= np.random.normal(80, 0.5) #%
PRES= np.random.normal(1017, 0.4) #hPa
string = str(HORA)+str(LOCA)+str(INTE)+str(TEMP)+str(UMID)+str(PRES)+USUA
result = hashlib.md5(string.encode())
HASH = result.hexdigest()
time.sleep(tempo_espera)
mensagem= str(HORA)+" "+str(LOCA)+" "+str(INTE)+" "+str(TEMP)+" "+str(UMID)+" "+str(PRES)+" "+str(USUA)+" "+str(HASH)
print (mensagem)
oi
\ No newline at end of file