FernandoKle / ejercicio_esp32

Practica con ESP32 y IoT
GNU General Public License v3.0
0 stars 0 forks source link

no atiende mensajes en los topicos susbcriptos #1

Open lurbani opened 6 months ago

lurbani commented 6 months ago

En base al branch mqtt_events del repo original del curso, propongo el siguiente template para la solución. No esta completo, pero lo probe en hardware físico y responde cuando se envía algo al topic iot2024/mi_id/destello

#main.py
from mqtt_as import MQTTClient, config
import asyncio
from settings import SSID, password, BROKER
import dht, machine
from machine import Pin
import ubinascii
import json
import btree

topicBase = ubinascii.hexlify(machine.unique_id()).decode('utf-8')

led = Pin(2, Pin.OUT)

#objeto con parametros que me interesa guardar con persistencia
class Datos():
    modo_auto = 1 #True
    periodo = 3
    setpoint = 26
    rele_estado = 0 #False

global datos
datos = Datos()

#funcion para recuperar los parametros cuando se resetea
def loadParams():
    global datos
    try:
        f = open("mydb", "r+b")#la base de datos ya existe, a cargar
        db = btree.open(f)
        datos.modo_auto = int(db["modo"])
        datos.periodo = int(db["periodo"])
        datos.rele_estado = int(db["rele"])
        datos.setpoint = int(db["setpoint"])
    except OSError:#la base de datos no existe, hay que crearla
        f = open("mydb", "w+b")
        db = btree.open(f)
        db["modo"] = str(datos.modo_auto) 
        db["periodo"] = str(datos.periodo) 
        db["rele"] = str(datos.rele_estado)
        db["setpoint"] = str(datos.setpoint)
    finally:
        db.flush()
        db.close()
        f.close()

#funcion para guardar datos persistentes en una base de datos ya existente
def saveParams():
    global datos
    f = open("mydb", "w+b")
    db = btree.open(f)
    db["modo"] = str(datos.modo_auto) 
    db["periodo"] = str(datos.periodo) 
    db["rele"] = str(datos.rele_estado)
    db["setpoint"] = str(datos.setpoint)
    db.flush()
    db.close()
    f.close()

async def destello():
    print('ESP32 usa Destello !')
    led.value(True)
    await asyncio.sleep(1)
    led.value(False)
    await asyncio.sleep(1)
    led.value(True)
    await asyncio.sleep(1)
    led.value(False)
    print('Fue muy efectivo !')

# Local configuration
config['server'] = BROKER
config['ssid'] = SSID
config['wifi_pw'] = password

# responde cuando se recibe un mensaje en alguno de los
#topicos subscriptos
async def messages(client):
    async for topic, msg, retained in client.queue:
        print(f'Topic: "{topic.decode()}" Message: "{msg.decode()}" Retained: {retained}')
        if "destello" in topic.decode():
            await destello()

# Esta funcion se ejecuta al conectarse
async def up(client):
    while True:
        await client.up.wait()  # Wait on an Event
        client.up.clear()
        #subscribo a estos topicos:
        await client.subscribe(f'iot2024/{topicBase}/destello', 1) 
        await client.subscribe(f'iot2024/{topicBase}/rele', 1)

async def main(client):
    loadParams()
    await client.connect()
    for coroutine in (up, messages):
        asyncio.create_task(coroutine(client))

    while True:
        #medicion
        temperatura = 22
        humedad = 30
        periodo = 1
        modo_auto = 1
        setpoint = 25

        #create json
        mensajeJson = json.dumps({'temperatura': temperatura,
                                'humedad': humedad,
                                'periodo': periodo,
                                'modo_automatico': modo_auto,
                                'setpoint': setpoint})
        #publish
        print(f'Enviando Datos a: iot2024/{topicBase}')
        await client.publish(f'iot2024/{topicBase}', mensajeJson, qos = 1)
        await asyncio.sleep(10) 

config["queue_len"] = 1  # Use event interface with default queue size
MQTTClient.DEBUG = False  # Optional: print diagnostic messages

client = MQTTClient(config)

try:
    asyncio.run(main(client))
finally:
    client.close()  # Prevent LmacRxBlk:1 errors
FernandoKle commented 5 months ago

Buenas. Modificando el código de suscripción y recepción de mensajes de acuerdo al ejemplo soluciono el problema. Ademas fue necesario quitar la especificación de version de micropython de "diagram.json" para poder hacerlo funcionar en el simulador.

Gracias por su tiempo.

b231178ae866519dc7c4f7196d0ddde906ce671f