# Imports
from machine import Pin, reset 
from time import sleep_ms, localtime
from network import WLAN, STA_IF
from ntptime import settime
from umqtt.robust import MQTTClient
from json import dumps, loads

topico = b"001/lavabo/lumi/estado"
topComando = b"001/lavabo/lumi/comando"

def shazam(top, pacote):
    global estado
    print (top)
    print (pacote)
    if top == topComando:
        try:
            msg = pacote.decode()
            if msg == 'on':
                estado = True
            else:
                estado = False
        except:
            print("Erro")
    else:
        print("Pacote entregue errado")
    

# Definição de pinos e recursos
chave = Pin(4, Pin.IN, Pin.PULL_UP)
rele = Pin(5, Pin.OUT, value=0)

# Internet/Wi-Fi
rede = WLAN(STA_IF)
rede.active(True)
if not rede.isconnected():
    rede.connect('Wokwi-GUEST','')
    tentativas = 0
    while not rede.isconnected() and tentativas < 20:
        tentativas += 1
        sleep_ms(500)

if rede.isconnected():
    print (localtime())
    settime()
    print (localtime())
    print(f'Config: {rede.ifconfig()}')
    mqtt = MQTTClient('crr690823',
                      'broker.hivemq.com')
    mqtt.set_callback(shazam)
    mqtt.connect()
    mqtt.subscribe(topComando)
else:
    mqtt = None
    print ('Não deu, meu quirido!')
    reset()


# Inicialização das variáveis e outros
estado = estadoAnt = False
eChave = eChaveAnt = chave()

#https://wokwi.com/projects/411222724670962689   

# Loop
while True:
    # Primeiro verifica o físico
    eChave = chave()
    if eChave != eChaveAnt:
        estado = not estado
        eChaveAnt = eChave
        sleep_ms(200)
    # Depois verifica as msgs
    try:
        mqtt.check_msg()
    except:
        print ('Deu ruim no check_msg')
        # Verificar a rede
        # Tentar reconectar ao broker
        
    if estado != estadoAnt:
       rele.value(estado) 
       try: 
           dic = {"timestamp":localtime(),
                  "estado": estado}
           msg = dumps(dic)
           mqtt.publish(topico, msg.encode())
       except:
           print ('Deu ruim no publicar')
           
       estadoAnt = estado
    
NOCOMNCVCCGNDINLED1PWRRelay Module