from machine import Pin, PWM, Timer#, WDT
from time import sleep_ms, localtime
import gc
from rede import Rede
from ntptime import settime
from json import load, loads, dumps
from umqtt.robust import MQTTClient
# Pinos
rele1 = Pin (22, Pin.OUT, value=1)
rele2 = Pin (23, Pin.OUT, value=1)
sensor = Pin (26, Pin.IN, Pin.PULL_DOWN)
bot = Pin (25, Pin.IN, Pin.PULL_DOWN)
# Função para aviso sem display
def notifica (codigo):
global rele1, rele2
if codigo == 'rede_ok':
rele1.off()
rele2.off()
sleep_ms(500)
elif codigo == 'erro_broker':
rele2.on()
rele1.off()
for _ in range(8):
rele1.value(not rele1.value())
rele2.value(not rele2.value())
sleep_ms(250)
elif codigo == 'erro_ntp':
rele2.on()
for _ in range(6):
rele1.value(not rele1.value())
sleep_ms(250)
elif codigo == 'erro_rede':
rele1.on()
for _ in range(6):
rele2.value(not rele2.value())
sleep_ms(250)
elif codigo == 'erro_rede2':
rele1.on()
for _ in range(10):
rele2.value(not rele2.value())
sleep_ms(250)
elif codigo == 'inicio':
rele2.off()
elif codigo == 'conecta_wifi':
rele1.on()
rele2.off()
else:
rele1.on()
rele2.on()
# Timer para auto/manual
tima = Timer(0)
def entraAuto(t):
global cfg
cfg["auto"] = True
#print("auto")
# Timer para refreshs
timb = Timer(1)
def pausaLimpa(t):
global refresh
refresh = True
# RPC para Thingsboard (callback do MQTTClient)
def rpc(t, p):
global automatico, c
try:
reqid = t.decode().replace(topRPCGeral,'')
acao = loads(p.decode())
print (acao)
if acao['method'] == "getNivel":
mqtt.publish((topRPCResp+reqid).encode(),
str(c).encode(), retain=True)
elif acao['method'] == "setNivel":
c = acao['params']
print (acao['params'])
elif acao['method'] == "getAuto":
mqtt.publish((topRPCResp+reqid).encode(),
b'1' if cfg["auto"] else b'0', retain=True)
elif acao['method'] == "setAuto":
cfg["auto"] = acao['params']
print (acao['params'])
except Exception as e:
print (p)
print (e)
# Função de debug da rede
def debug(arg):
print (arg)
# Configuração geral
with open("config.json") as arq:
cfg = load(arq)
#print(cfg)
topico = b'v2/t'
topRPCGeral = 'v2/r/req/'
topRPCResp = 'v2/r/res/'
# Fase 1: carregou tudo - Liga lâmpada fraca para avisar
notifica('inicio')
try:
r = Rede (cfg["rede"], cfg["senha"], cb=debug)
except:
#print ("Erro geral de conexão à rede")
notifica ('erro_rede')
reset()
# Fase 2: Tentou conectar à rede - Liga lâmpada forte para avisar
notifica('conecta_wifi')
if r.conectado:
try:
settime()
except:
#print ('Erro no NTP. Vida que segue')
notifica('erro_ntp')
try:
mqtt = MQTTClient(cfg["clientId"], cfg["broker"],
user=cfg["usuario"], password=cfg["brokerSenha"])
mqtt.set_callback(rpc)
mqtt.connect()
mqtt.subscribe(b"v2/r/req/+")
except:
#print ('Deu ruim no broker')
notifica('erro_broker')
# Fase 3a: Conectou à rede OK
notifica('rede_ok')
else:
print ('Não conectou à rede')
notifica('erro_rede2')
# Fase 3b: Iniciando loop
rele1.on()
rele2.on()
c = 0
#dog = WDT(cfg["dogTime"])
bAtual = bAnt = bot.value()
refresh = False
timb.init(period=2000, mode=Timer.PERIODIC, callback=pausaLimpa)
while True:
try:
if r.conectado:
mqtt.check_msg()
else:
r.desconectar()
sleep_ms(500)
print ("Reconectando")
r.conectar(tentativas=20)
if r.conectado:
mqtt.disconnect()
sleep_ms(500)
mqtt.connect()
mqtt.subscribe(b"v2/r/req/+")
except:
print ('Deu ruim')
notifica('erro_rede2')
bAtual = bot.value()
if bAtual != bAnt : #AGUARDA BOTÃO
if bAtual == 1:
cfg["auto"] = False
tima.init(period=2000, mode=Timer.ONE_SHOT, callback=entraAuto)
#publicar em v2/r/req/$request_id auto True
else:
tima.deinit()
if not cfg["auto"]:
c = (c+1)%4
#publicar em v2/r/req/$request_id c
#publicar em v2/r/req/$request_id auto False
sleep_ms (250)
bAnt = bAtual
if cfg["auto"]:
if sensor.value()==1:
rele1.off()
rele2.off()
#print('ligado')
else:
rele1.on()
rele2.on()
#print('desligado')
#sleep_ms(250)
else:
if c == 0:
rele1.on()
rele2.on()
elif c == 1:
rele1.off()
rele2.on()
elif c == 2:
rele2.off()
rele1.on()
else:
rele1.off()
rele2.off()
#dog.feed()
if refresh:
sleep_ms(100)
gc.collect()
refresh = False