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

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

parent c054b6e3
#!/usr/bin/env python3 #!/usr/bin/env python3
''' '''
Programa que roda até ser encerrado (ctrl+c) recebendo mensagens de um tópico por mqtt Programa que roda até ser encerrado (ctrl+c) checando por erros as mensagens recebidas
e salva em uma date base. As mensagens de erro são mandadas para o tópico feedback no localhost 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 paho.mqtt.client as mqtt
import time
import hashlib import hashlib
import mysql.connector import mysql.connector
from datetime import datetime 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 ############ ############ funções ############
def check_usuario(): def check_usuario():
cur.execute("USE COSMICPAMPA;") cur.execute("USE COSMICPAMPA;")
cur.execute('select user from usuarios;') cur.execute('select user from usuarios;')
myresult = cur.fetchall()
return(myresult) return(cur.fetchall())
def insert_bd(colunas,valores):
def insere_bd(colunas,valores):
cur.execute("USE COSMICPAMPA;") cur.execute("USE COSMICPAMPA;")
cur.execute("INSERT INTO eventos ({}) VALUES({})".format(colunas,valores)) #Salva comando no cursor 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 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 received " ,str(message.payload.decode("utf-8"))) #imprime msg no terminal
# print("message topic=",message.topic) # imprime tópico # print("message topic=",message.topic) # imprime tópico
#print("message qos=",message.qos) # print("message qos=",message.qos)
#print("message retain flag=",message.retain) # print("message retain flag=",message.retain)
# colocando dados em variaveis que representam as grandezas medidas # colocando dados em variaveis que representam as grandezas medidas
pre_dados = str(message.payload.decode("utf-8")) # transforma a mensagem recebida em string 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 ...@@ -57,31 +77,37 @@ def on_message(client, userdata, message): # Funcao que roda toda vez que se rec
# Checa o usuario # Checa o usuario
usuarios_cadastrados = check_usuario() usuarios_cadastrados = check_usuario()
for x in usuarios_cadastrados: for x in usuarios_cadastrados:
d=0
usuario_comparacao= str(usua)[1:-1] usuario_comparacao= str(usua)[1:-1]
if (usuario_comparacao == str(x)[2:-3]): cadastrado_bool = False
d=1
break cadastrado_bool = usuario_comparacao == str(x)[2:-3]
if ( d == 0 ):
mensag = "usuario não cadastrado: "+usua if cadastrado_bool:
print( mensag+ str(hoje),file = open(output,'a')) break
if not cadastrado_bool:
mensag = "usuario não cadastrado: "+usua
print( mensag+ str(hoje),file = open(output,'a'))
client.publish("feedback", mensag) client.publish("feedback", mensag)
# Checa o Hash # Checa o Hash
string = str(hora)+str(loca)[1:-1]+str(inte)+str(temp)+str(umid)+str(pres)+usua[1:-1] string = str(hora)+str(loca)[1:-1]+str(inte)+str(temp)+str(umid)+str(pres)+usua[1:-1]
result = hashlib.md5(string.encode()) result = hashlib.md5(string.encode())
hash2 = result.hexdigest() hash2 = result.hexdigest()
hash1= "{}".format(dados[7]) # hash específico para comparação, sem '' 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") client.publish("feedback","dadosHASH confere")
# intensidade > 0
# intensidade > 0 # intensidade > 0
if (inte<0): #essa? if (inte<0):
mensag = "intensidade menor que zero" mensag = "intensidade menor que zero"
print( mensag+str(hoje),file = open(output,'a')) print( mensag+str(hoje),file = open(output,'a'))
client.publish("feedback",mensag) client.publish("feedback",mensag)
else: else:
colunas += ",intensidade" colunas += ",intensidade"
valores += "," + str(inte) valores += "," + str(inte)
...@@ -89,8 +115,10 @@ def on_message(client, userdata, message): # Funcao que roda toda vez que se rec ...@@ -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°) # 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): if (-274>temp or umid>1000):
mensag = "temperatura errada" mensag = "temperatura errada"
print( mensag+str(hoje),file = open(output,'a')) print( mensag+str(hoje),file = open(output,'a'))
client.publish("feedback",mensag) client.publish("feedback",mensag)
else: else:
colunas += ",temperatura" colunas += ",temperatura"
valores += "," + str(temp) valores += "," + str(temp)
...@@ -98,8 +126,10 @@ def on_message(client, userdata, message): # Funcao que roda toda vez que se rec ...@@ -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% # Checa se umidade está entre 0% e 100%
if (0>umid or umid>100): if (0>umid or umid>100):
mensag= "umidade errada" mensag= "umidade errada"
print( mensag+str(hoje),file = open(output,'a')) print( mensag+str(hoje),file = open(output,'a'))
client.publish("feedback",mensag) client.publish("feedback",mensag)
else: else:
colunas += ",umidade" colunas += ",umidade"
valores += "," + str(umid) valores += "," + str(umid)
...@@ -107,28 +137,30 @@ def on_message(client, userdata, message): # Funcao que roda toda vez que se rec ...@@ -107,28 +137,30 @@ def on_message(client, userdata, message): # Funcao que roda toda vez que se rec
# Pressao > 0 # Pressao > 0
if (pres<=0): if (pres<=0):
mensag = "pressao menor que zero" mensag = "pressao menor que zero"
print( mensag+str(hoje),file = open(output,'a')) print( mensag+str(hoje),file = open(output,'a'))
client.publish("feedback",mensag) client.publish("feedback",mensag)
else: else:
colunas += ",pressao" colunas += ",pressao"
valores += "," + str(pres) valores += "," + str(pres)
# add valores faltam
# add valores faltam
colunas += ",usuario,HASH" colunas += ",usuario,HASH"
valores += ","+usua+","+hash valores += ","+usua+","+hash
## Inserção no banco de dados ## 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 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 mensag = "HASH diferentes hash1: "+hash1+"hash2: "+hash2
print( mensag+str(hoje),file = open(output,'a')) print( mensag+str(hoje),file = open(output,'a'))
client.publish("feedback", mensag) 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 Programa que recebe um arquivo e substitui uma palavra por outra
e escreve novamente no arquivo e escreve novamente no arquivo
...@@ -139,8 +171,7 @@ def trocatexto(nomefile,outword, inword): ...@@ -139,8 +171,7 @@ def trocatexto(nomefile,outword, inword):
inword (str): pela pela qual a outword será substituida inword (str): pela pela qual a outword será substituida
''' '''
with open(nomefile,"r") as arquivo: #abre sem apagar o arquivo 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 mudado = lido.replace(outword,inword) #troca a str em outword pelo str em inword
with open(nomefile,"w") as arqu: #apaga texto do arquivo with open(nomefile,"w") as arqu: #apaga texto do arquivo
...@@ -150,36 +181,21 @@ def erro(html): # func ...@@ -150,36 +181,21 @@ def erro(html): # func
with open(html,"r") as arquivo: #abre sem apagar o arquivo with open(html,"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
string_erro = lido[10584:-25] 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 return(string_erro)
broker_address="localhost"
topico= "cosmic"
user_db = 'user'
password_db = 'senha'
output= 'log_inicial.dat'
# Programa principal
try: 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') db_connection = mysql.connector.connect(host='localhost',user = user_db, passwd = password_db, auth_plugin='mysql_native_password')
cur = db_connection.cursor() cur = db_connection.cursor()
############ Subscribe ao tópico ############ ############ Subscribe ao tópico ############
username_MQTT="cta" #user para MQTT
password_MQTT="cta" #senha para MQTT
client = mqtt.Client("P1") #create new instance client = mqtt.Client("P1") #create new instance
client.on_message = on_message #attach function to callback client.on_message = on_message #attach function to callback
...@@ -189,9 +205,12 @@ try: ...@@ -189,9 +205,12 @@ try:
client.connect(broker_address) #connect to broker 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.subscribe(topico) # se inscreve no tópico (quando chega mensagem chama a função on_message)
client.loop_forever() # repete tudo relacionado ao mqtt client.loop_forever() # repete tudo relacionado ao mqtt
except Exception as e: except Exception as e:
trocatexto(endereco_html,"verde","verme") troca_texto(endereco_html,"verde","verme")
trocatexto(endereco_html,"ok",f"O erro foi {e} no programa inicial.py") 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