MQTT mínimo con Micropython

He tenido la intención de jugar con MQTT por un tiempo, y finalmente decidí meterme una noche la semana pasada. Tenía tres sensores de temperatura y humedad para el hogar baratos, y me molestaba que a menudo no estuvieran de acuerdo. Sorprendentemente, aunque el analógico tenía un ajuste de calibración detrás, no tengo idea de cómo calibrar los dos digitales. Tomé esto como una señal de que había llegado el momento de aprender MQTT y poder instalar mis propios sensores precisos. Por supuesto, comencé a pedir los sensores más baratos que pude encontrar, pero siempre puedo actualizarlos más tarde.

Tres sensores baratos

Si bien hemos escrito lo suficiente sobre MQTT en La-Tecnologia, tuve que ir hasta 2016 para encontrar esta serie introductoria de cuatro partes de Elliot Williams. Cinco años es mucho tiempo en el mundo te worldnika, pero decidí intentarlo de todos modos.

Construya un corredor

El primer artículo funcionó a la perfección, aunque en lugar de una Raspberry Pi, usé una computadora de escritorio vieja que mi esposa estaba a punto de tirar. Después de eliminar Windows, duplicar la RAM e instalar Debian, ejecuté una nueva máquina de laboratorio. Instalé el mosquitto paquetes de los repositorios estándar, y los usé sin problemas para seguir este artículo (también probé brevemente también en máquinas Ubuntu y Mac). La instalación es tan sencilla como:

  • Debian y Ubuntu
    • sudo apt install mosquitto
    • sudo apt install mosquitto-clients
  • Mac OS
    • brew install mosquitto
  • Nodos interconectados

    El problema comenzó con el segundo artículo. Elliot usó un módulo ESP-8266 y un NodeMCU. Quería probar NodeMCU, así que me lancé hacia adelante. Si bien no tenía 8266 módulos a mano, sí tenía un módulo ESP32 DevKitC. En el pasado, he presentado estos y módulos similares con GRBL, Micropython y nude metal - "¿Qué tan difícil podría ser eso?", Pensé para mí.

    Bueno, de hecho resultó bastante difícil. Además, construí imágenes personalizadas de NodeMCU en línea, pude crear el esptool.py hablar y programar mi tablero. Pero intente tanto como sea posible, y lo intenté durante horas, no pude iniciar mi tablero sin errores. La placa estaba programada y pirateada correctamente, pero siempre daba errores al inicio. He leído muchos informes similares de usuarios en línea, así que al menos no estoy solo en mi problema debido a mi frustración.

    Me puse en contacto con algunos programadores profesionales y el consejo que recibí fue seguir adelante. Sugirieron que NodeMCU está desactualizado y no me sorprende que tenga dificultades. Estoy seguro de que posiblemente podría ejecutar NodeMCU: la evidencia muestra un problema con el inicio del hardware (pin de E / S o configuración), la imagen de Internet se cargó en la dirección incorrecta o simplemente estaba equivocada. Pero después de tantas horas desperdiciadas, quería experimentar con MQTT, no convertirme en un experto en NodeMCU.

    Habiendo usado Micropython antes, y viendo que podía importar un módulo MQTT, decidí hacer este enfoque. La configuración del equipo está un poco ocupada, pero las instrucciones en el repositorio de Micropython Github fueron bastante fáciles de seguir.

    La información sobre el servidor MQTT en Micropython se puede encontrar aquí, y encontré este tutorial de dos partes de [boneskull] bastante útil también:

    • Ponte en pie, primera parte
    • Ponte en pie, segunda parte
    • Una vez que todo estuvo instalado, pude crear un REPL y comenzar a programar. Yo suelo usar rshell cuando se utiliza Micropython en sistemas integrados:

      pip install rshell
      rshell --editor nvim --port /dev/cu.usbserial-1410 --baud 115200

      Si prefiere conectarse de forma inalámbrica, también existe el método WebREPL que probé y pareció funcionar bien. Y, por supuesto, puede simplemente conectarse con el emulador final, pero guardar y editar archivos se convierte en un problema.

      Creé mi sensor de demostración siguiendo la misma línea que el del artículo original. Vea este repositorio de Github que contiene la unidad flash Micropython resultante. Copie esto en su tablero, editando los detalles de MQTT y WiFi:

      MOGI_ID = 'esp32a-mogi'
      MOGI_BROKER = 'underdog.lan'
      WIFI_SSID = 'Covid-19-Laboratory'
      WIFI_PASSWORD = 'yourpasswordhere'

      Ingrese el REPL usando rshell o el método que prefiera, e inicie el nodo ejecutando mystation(). Una vez probado, puede crear main.py archivo para que se inicie automáticamente si lo desea. (Nota: MOGI es la palabra coreana para mosquito).

      Control y Clientes

      No profundicé demasiado en el tercer artículo de la serie. Encontré algunas aplicaciones de iOS que funcionaron bien con mi servidor.

      • EasyMQTT
      • MQTTool
      • Poder y privacidad

        Creo que el meollo del artículo final sigue siendo válido. Todavía no he puesto el nodo del sensor de prueba en las baterías, por lo que no puedo confirmar estos números. Ese será un proyecto para otro día.

        En general, el material básico de la serie original de Elliot sigue siendo relevante en la actualidad. No es sorprendente que los detalles del programa hayan cambiado ligeramente a lo largo de los años. En lugar de excavar en un agujero más profundo con NodeMCU, cambié y ejecuté una demostración similar con Micropython. Ahora que estoy comprometido con MQTT, pronto profundizaré en los nodos de la batería y en los indicadores de datos bastante gráficos. Mi plan definitivo es piratear la red de automóviles domésticos.

        • Menga dice:

          ¿Pudiste configurar QoS en el micrófono?
          Cuando creé mi servidor MQTT, descubrí que se puede usar ESP como servidor, y pude reemplazar mi costoso beaglebone negro con ESP12 y ahorrar algo de dinero.
          Aprendí un poco de MQTT antes de los artículos de Elliot y también me sirvió bien.

          • bru dice:

            QoS de 0 y 1 es compatible con uMQTT en MicroPython y MiniMQTT en CircuitPython (basado en uMQTT, tiene un poco más de funcionalidad).

        • William F. Dudley Jr. dice:

          Puse MQTT por completo y sigo encontrando usos para él. Mi termostato puede emitir la temperatura ambiente y también acepta órdenes para cambiar la temperatura, etc. Mi computadora, que se cuelga de los vendedores por teléfono, usa MQTT para informar las llamadas entrantes, de modo que pueda verificar lo que fue rechazado. Por supuesto, mis luces están controladas por MQTT, pero también un ventilador de toda la casa, calentadores de agua lineales para abrir / cerrar ventanas. El abre-puertas de garaje eléctrico está habilitado durante el día y deshabilitado durante la noche por MQTT. Una vez que tenga la infraestructura MQTT, encontrará nuevos programas para ella. La Raspberry Pi, que ejecuta el servidor de mosquitos, también lanza scripts perl que, por ejemplo, calculan y emiten el punto de rocío, y automáticamente abre las ventanas y enciende todo el ventilador de la casa si la temperatura exterior y el punto de rocío lo favorecen.

        • Lee Studley dice:

          Quería jugar con TRBBL pero leí que si lo hacía, podría quedarme ciego.

          • Lee Studley dice:

            Un enlace corto a una wiki puede haber salvado mi visión: https://en.wikipedia.org/wiki/MQTT

        • DrRealist dice:

          Todavía no entiendo el problema, aunque usando solo UDP y WPA2 seguro solo Wifi con mi ESP32 / 8266 no sufro pérdida de paquetes o la necesidad de una jerarquía de temas.

          Esto parece haberse agotado o soy un dinosaurio esperando extinguirse. Tengo todos los datos, perfectamente visualizados en RRDtool.
          Hazme entrar ahora.

          • El micrófono dice:

            MQTT es increíble para la comunicación multicliente. Y el protocolo es bastante simple, adaptable y diseñado para un ancho de banda miserable.

            Échale un vistazo. No te arrepentirás.

            • DrRealist dice:

              Bueno, lo intentaré, incluso si es solo para la curva de aprendizaje.

              • Elliot Williams dice:

                Pruébelo en su escritorio, usando los clientes de línea de comando. Hay muy poco aprendizaje.

                mosquitto_sub -h localhost -v -t "#" comprobará todo el tráfico MQTT local mientras realiza la prueba. Muy conveniente.

          • Elliot Williams dice:

            La gran diferencia para mí es la función de venta y promoción, que separa efectivamente todos los dispositivos entre sí en el "corredor" (servidor). Esto significa que puede piratear este widget que produce datos y luego piratear el dispositivo que los consume, sin pensar en absoluto. Uno a uno, varios a uno y uno a varios son básicamente lo mismo. Y como William F. Dudley Jr. mencionado, escribir scripts para procesar esos datos en el medio también es muy fácil.

            Absolutamente podría hacer lo mismo con código personalizado y UDP. Si está investigando MQTT, no hay mucho por ahí: es un protocolo de transferencia muy liviano. La "M" es "mínima" después de todo. Pero es una capa más además de UDP sin procesar (y en este caso TCP).

            Creo que algunas personas que se resisten a MQTT piensan que será un protocolo pesado / voluminoso como REST sobre HTML o algo así. No lo es.

            Pero básicamente ya está implementado en todas partes, por lo que no tiene que preocuparse por el protocolo si no lo desea. A la gente le gusta mucho Node-RED y también algunas de las infraestructuras de base de datos desarrolladas alrededor de MQTT. Si necesita este tipo de cosas, es sencillo integrarlo.

            • DrRealist dice:

              Gracias por explicármelo Elliot,

              Creo que mi verdadero problema es dejarme. Probablemente MQTT sea asombroso, pero estoy en mi burbuja KISS. Siento que confiar en la complejidad la convierte en otra caja negra mágica para mí. Entiendo que MQTT me facilita las cosas y no es necesariamente complejo, pero el funcionamiento interno de MQTT podría serlo.

              Me preocupa menos el bulto que usar algo e introducir agujeros de seguridad porque estoy tergiversando algo. Mi red doméstica es cómoda y segura, si tuviera que hacer IoT en la red, probablemente usaría JSON y ChaCha20-Poly1305, ya que AEAD se asegura de que los datos no hayan cambiado realmente desde mi sensor.

              Pero sí, supongo que tengo que probar MQTT para ver qué puede hacer por mí personalmente.

              { "Nonce": "QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZX", "header", "UFFSU8DBwsPExcbH", "texto cifrado": "vW0XnT6D1DuVdleUk8DpOVcqFwAlK / rMvtKQLCE5bLtzHH8bC0qmRAvzqC9O2n45rmTGcIxUwhbLlrcuEhO0Ui + Mm6QNtdlFsRtpuYLBu54 / P6wrw2lIj3ayODVl0 // 5IflmTJdjfal2iBL2FcaLE7Uu", "etiqueta": "wIdZJMHHmHlH3q / YeArPSQ =="}

              El mensaje fue:
              "Damas de la clase 99: si pudiera ofrecerles un consejo para el futuro, sería protector solar".

              QSH. Demasiado y fuera.

              • Mella dice:

                El comediante John Safran hizo una gran parodia de esto, buscando "no la canción del protector solar".

          • Marc Compere dice:

            También me pregunto por qué se necesita MQTT sobre la mensajería udp estándar. Agregar complejidad no parece ser el camino correcto a seguir

          • dnvr dice:

            Hay variantes de MQTT que se ejecutan en UDP, como MQTT-SN (MQTT / UDP): https://mqtt-udp.readthedocs.io/en/latest/

        • Ajustes dice:

          Creo que sería más fácil usar ESPHome y Home Assistant. O nudo rojo.

        • Elliot Williams dice:

          Estoy con Chris en este: si tuviera que volver a hacer mi serie MQTT, lo haría con MicroPython. Entonces (¡hace 5 años!) NodeMCU fue el más una manera fácil de comenzar con el ESP8266, pero no es mi favorito. Debido a la forma en que funciona el sistema de cola de eventos, no puede enviar más de unos pocos mensajes MQTT por segundo, por ejemplo. Esa es una pregunta innecesaria.

          Mientras tanto, NodeMCU también ha visto algunos cambios en la API que rompen el código, lo que significa que mi código anterior puede que ya no funcione en versiones recientes. Cuando mis dispositivos dejen de funcionar aquí, migraré a MicroPython en lugar de migrar a una versión más nueva de NodeMCU. Afortunadamente, desafortunadamente, todos todavía funcionan bien. 🙂

          Y como señaló Chris, la compatibilidad con el paquete MQTT / mosquitto ha mejorado enormemente desde entonces. Lo que era de dos líneas (agregar repositorio, descargar programa) para configurar el servidor ahora se ha convertido en una sola línea (descargar software). Diablos, los BeagleBones vienen preinstalados con mosquitto y NodeRED hoy en día. Podría haber escrito la serie en tres artículos en lugar de cuatro.

          Pero el verdadero punto de esa serie no fue NodeMCU, eso fue solo un detalle de implementación, en mi opinión. La cuestión era lo bueno que es construir una red / marco de datos domésticos en un bar, como MQTT. ¡Y lo apoyaré!

Manuel Gómez
Manuel Gómez

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *