Commit ccec108d authored by Bruno Thomazi Zanette's avatar Bruno Thomazi Zanette 🎱

Update inicial.py, otimização e documentação

parent c054b6e3
#!/usr/bin/env python3
'''
Programa que roda até ser encerrado (ctrl+c) recebendo mensagens de um tópico por mqtt
e salva em uma date base. As mensagens de erro são mandadas para o tópico feedback no localhost
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 logging
import paho.mqtt.client as mqtt
import time
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;')
myresult = cur.fetchall()
return(myresult)
def insert_bd(colunas,valores):
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)
#### 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)
# 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
......@@ -57,31 +77,37 @@ def on_message(client, userdata, message): # Funcao que roda toda vez que se rec
# Checa o usuario
usuarios_cadastrados = check_usuario()
for x in usuarios_cadastrados:
d=0
usuario_comparacao= str(usua)[1:-1]
if (usuario_comparacao == str(x)[2:-3]):
d=1
break
if ( d == 0 ):
mensag = "usuario não cadastrado: "+usua
print( mensag+ str(hoje),file = open(output,'a'))
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 d==1): # só manda para o BD se o HASH for igual
if (hash2==hash1 and cadastrado_bool): # só manda para o BD se o HASH for igual
client.publish("feedback","dadosHASH confere")
# intensidade > 0
# intensidade > 0
if (inte<0): #essa?
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)
......@@ -89,8 +115,10 @@ def on_message(client, userdata, message): # Funcao que roda toda vez que se rec
# 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)
......@@ -98,8 +126,10 @@ def on_message(client, userdata, message): # Funcao que roda toda vez que se rec
# 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)
......@@ -107,28 +137,30 @@ def on_message(client, userdata, message): # Funcao que roda toda vez que se rec
# 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
# add valores faltam
colunas += ",usuario,HASH"
valores += ","+usua+","+hash
## Inserção no banco de dados
insert_bd(colunas,valores) #chama a função que INSERT 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(d==1): #caso hash não confira
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 trocatexto(nomefile,outword, inword):
def troca_texto(nomefile,outword, inword):
'''
Programa que recebe um arquivo e substitui uma palavra por outra
e escreve novamente no arquivo
......@@ -139,8 +171,7 @@ def trocatexto(nomefile,outword, inword):
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
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
......@@ -150,36 +181,21 @@ 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)
############ valores iniciais ############
endereco_html = "/var/www/html/testou.html"
trocatexto(endereco_html,"verme","verde")
trocatexto(endereco_html,erro(endereco_html),"ok")
global cur
broker_address="localhost"
topico= "cosmic"
user_db = 'user'
password_db = 'senha'
output= 'log_inicial.dat'
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 ############
username_MQTT="cta" #user para MQTT
password_MQTT="cta" #senha para MQTT
client = mqtt.Client("P1") #create new instance
client.on_message = on_message #attach function to callback
......@@ -189,9 +205,12 @@ try:
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:
trocatexto(endereco_html,"verde","verme")
trocatexto(endereco_html,"ok",f"O erro foi {e} no programa inicial.py")
troca_texto(endereco_html,"verde","verme")
troca_texto(endereco_html,"ok",f"O erro foi {e} no programa inicial.py")
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment