from machine import reset, Timer
from rede import Rede
from time import sleep_ms, time
from json import load, dumps, loads
from ntptime import settime
from umqtt.robust import MQTTClient
from processo import Volume
topTele = b'v1/devices/me/telemetry'
topRPC = 'v1/devices/me/rpc/request/'
topRPCResp = 'v1/devices/me/rpc/response/'
bomba = False # define o estado inicial da bomba (desligada)
valv_prop = False # define o estado inicial da válvula (fechada)
volume = 750 # define o volume inicial do tanque
vazao_ent = 0 # define a vazão inicial de entrada
vazao_sai = 5 #define a vazão inicial de saída
def procRPC (t, p):
global bomba, vazao_ent, valv_prop
print(t)
numReq = t.decode().replace(topRPC, '')
acao = loads(p.decode())
if acao['method'] == 'setBomba':
bomba = acao['params'] #dados
cliente.publish((topRPCResp + numReq).encode()), str(bool(bomba.value()).lower().encode())
print(acao)
elif acao['method'] == 'setVazao':
vazao_entrada = acao['params'] #dados
cliente.publish((topRPCResp + numReq).encode(), dumps({"vazao": vazao_ent}).encode())
elif acao['method'] == 'setValvula':
valvula_aberta = acao['params'] #dados
cliente.publish((topRPCResp + numReq).encode(), str(bool(valv_prop)).lower().encode())
with open('config.json', 'r') as arq:
cfg = load(arq)
def cbTimer(t):
global itsTime
itsTime = True
def debug(arg):
print(arg)
with open('config.json') as arq:
cfg = load(arq)
r = Rede(cfg['rede'], cfg['senha'],
cb=debug)
if r.conectado:
settime()
cliente = MQTTClient(cfg["clientId"], cfg["broker"], user=cfg["userbroker"], password='')
cliente.set_callback(procRPC)
cliente.connect()
cliente.subscribe(b'v1/devices/me/rpc/request/+') #inscreve nos tópicos de request RPC
else:
print ('Não foi possível conectar...Reiniciando')
sleep_ms(2000)
reset()
itsTime = False
tictac = Timer(0)
tictac.init(mode = Timer.PERIODIC, period = 500, callback = cbTimer)
dados = {}
while True:
cliente.check_msg()
if bomba:
volume += vazao_ent
if valv_prop:
volume -= vazao_sai
volume = max(0, min(1000, volume))
# atualização da telemetria
if itsTime:
dados['ts'] = (time()+946684800)*1000
dados = {
"vol": volume,
"bomba": bomba,
"vazao": vazao_ent,
"saida": vazao_sai,
"valv": valv_prop
}
payload = dumps(dados).encode()
cliente.publish(topTele, payload)
itsTime = FalseLoading
aitewinrobot-esp32c3-supermini
aitewinrobot-esp32c3-supermini