from machine import reset, Pin, Timer
from rede import Rede
from time import sleep_ms, time, ticks_ms
from json import load, dumps, loads
from ntptime import settime
from umqtt.robust import MQTTClient
from processo import Volume
topTelemetria = b'v1/devices/me/telemetry'
topRPCGeral = 'v1/devices/me/rpc/request/'
topRPCResp = 'v1/devices/me/rpc/response/'
def procRPC(t,p):
global cliente
nroReq = t.decode().replace(topRPCGeral, '')
acao = loads(p.decode())
if acao['method'] == 'getBomba':
cliente.publish((topRPCResp + nroReq).encode(), str(processo.getBomba()).encode())
elif acao['method'] == 'setBomba':
processo.setBomba(int(acao['params']))
elif acao['method'] == 'getVazao':
cliente.publish((topRPCResp + nroReq).encode(), str(processo.getVazao()).encode())
elif acao['method'] == 'setVazao':
processo.setVazao(int(acao['params']))
elif acao['method'] == 'getSaida':
cliente.publish((topRPCResp + nroReq).encode(), str(processo.getSaida()).encode())
elif acao['method'] == 'setSaida':
processo.setSaida(bool(acao['params']))
else:
print(p)
with open('config.json', 'r') as arq:
cfg = load(arq)
def cbTimer(t):
global taNaHora
taNaHora = True
def debug(arg):
print(arg)
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/+')
else:
print ('Deu ruim...Reiniciando')
sleep_ms(2000)
reset()
taNaHora = False
timm = Timer(0)
timm.init(mode = Timer.PERIODIC, period = 500, callback = cbTimer)
# Cria e inicializa a simulação
processo = Volume()
dados={'ts':0, 'values':{}}
# valor correto de timestamp -> 'ts':(time()+946684800)*1000
while True:
cliente.check_msg()
processo.update()
# atualização da telemetria
if taNaHora:
dados['ts'] = (time()+946684800)*1000
dados['values']['Volume'] = processo.getVolume()
dados['values']['Vazão'] = processo.getVazao()
dados['values']['realVazao'] = processo.getMedida()
dados['values']['Saida'] = processo.getSaida()
dados['values']['Bomba'] = processo.getBomba()
cliente.publish(topTelemetria, dumps(dados).encode())
# inserir dados de telemetria aqui
taNaHora = False