# Por RPC
# setBomba() - Liga/Desliga Bomba de entrada (1/0)
# setSaida() - Abra/Fecha válvula solenoide (1/0)
# setVazao() - Define a vazão da bomba (0-750l/h)

# Por telemetria
# medida - Vazão de entrada medida por sensores
# volume - Volume no tanque

from machine import reset
from time import time, sleep_ms, ticks_ms
from json import load, loads, dumps
from umqtt.robust import MQTTClient
import ntptime
from rede import ativaWifi, reconecta

topTelemetria = b'v1/devices/me/telemetry'
topRPCGeral = 'v1/devices/me/rpc/request/'
topRPCResp = 'v1/devices/me/rpc/response/'
topAttGeral = 'v1/devices/me/attributes/request/'
topAttResp = 'v1/devices/me/attributes/response/'


def rpc(t, p):

    print (t, p)
    #reqid = t.decode().replace(topRPCGeral, '')
    #acao = loads(p.decode())
    #print(acao)


with open('config.json', 'r') as arq:
    cfg = load(arq)

atualizaTelemetria = ticks_ms()

wifi = ativaWifi(cfg['rede'], cfg['senha'])
if not wifi:
    print ('Sem rede. Reiniciando')
    sleep_ms(1500)
    reset()

ntptime.settime()

mqtt = MQTTClient(cfg['clientId'], cfg['broker'], user = cfg['usuario'], password = cfg['password'])
mqtt.set_callback(rpc)
mqtt.connect()
print ('requests')
mqtt.subscribe(b"v1/devices/me/rpc/request/+")
print ('attrs')
mqtt.subscribe(b"v1/devices/me/attributes/response/+")
print ('todos')
mqtt.subscribe(b"v1/devices/me/attributes")


dados = {'ts': 0, 'values': {'nro': 0}}

attr = {'kp': 1.0, 'kd': 0.0, 'ki': 0.001}

n=0
mqtt.publish(b'v1/devices/me/attributes', dumps(attr).encode())

while True:
    mqtt.check_msg()
    if not wifi.isconnected():
        reconecta(wifi, cfg['rede'], cfg['senha'])
    if ticks_ms() >= atualizaTelemetria:
        dados['ts'] = (time()+946684800)*1000
        dados['values']['nro'] = n
        mqtt.publish(topTelemetria, dumps(dados).encode())
        n += 1

        atualizaTelemetria = ticks_ms() + cfg['intervalo']

print("Finalizando simulação")