domingo, 20 de agosto de 2017

Tutorial #17 ESP8266 (Parte7) – Integrar MQTT con MySQL usando Python

Este es el séptimo tutorial de IOT (internet de las cosas) usando MQTT en un ESP8266; en estos videos (Parte A y B) explico cómo integrar MQTT (usando el bróker CloudMQTT) con MySQL, para eso vamos a usar Python y dos librerías, “paho-mqtt 1.3.0” para conectarse con MQTT y “MySQL-python 1.2.5” para trabajar con la base de datos. En la parte B del tutorial termino de explicar cómo crear la base de datos usando la herramienta phpMyAdmin incluida en el servidor local WAMP “Uniform Server – Coral 8.9.2”; y agrego lo que falta del código de Python como trabajar con la base de datos.

Parte A:


Parte B:


tutorial17.py:

#!/usr/bin/env python 1
# -*- coding: utf-8 -*-

import paho.mqtt.client as mqtt
import sys

# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):
    print("Conectado - Codigo de resultado: "+str(rc))

    # Subscribing in on_connect() means that if we lose the connection and
    # reconnect then subscriptions will be renewed.
    client.subscribe("/#")

# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

try:
    client.connect("m13.cloudmqtt.com", 11948, 60)
except:
    print("No se pudo conectar con el MQTT Broker...")
    print("Cerrando...")
    sys.exit()
    
client.username_pw_set("lqeamtbn", "vh0cU_Vcszxp")

try:
    client.loop_forever()
except KeyboardInterrupt:  #precionar Crtl + C para salir
    print("Cerrando...")

tutorial17b.py:

#!/usr/bin/env python 1
# -*- coding: utf-8 -*-

import paho.mqtt.client as mqtt
import sys
import MySQLdb

# Abrir conexión con bases de datos
try:
    db = MySQLdb.connect("127.0.0.1","root","root","tutorial17")
except:
    print("No se pudo conectar con la base de datos")
    print("Cerrando...")
    sys.exit()

# Preparando cursor
cursor = db.cursor()

# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):
    print("Conectado - Codigo de resultado: "+str(rc))

    # Subscribing in on_connect() means that if we lose the connection and
    # reconnect then subscriptions will be renewed.
    client.subscribe("/#")

# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))
    lista = msg.topic.split("/")

    sql = """INSERT INTO `tutorial17`.`tabla` (`id`, `usuario`, `topic`, `mensaje`, `fecha`) VALUES (NULL, '""" + lista[1]+ """', '""" + lista[2] + """', '""" + str(msg.payload) + """', CURRENT_TIMESTAMP);"""

    try:
        # Ejecutar un comando SQL
        cursor.execute(sql)
        db.commit()
        print("Guardando en base de datos...OK")
    except:
        db.rollback()
        print("Guardando en base de datos...Falló")
        
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

try:
    client.connect("m13.cloudmqtt.com", 11948, 60)
except:
    print("No se pudo conectar con el MQTT Broker...")
    print("Cerrando...")
    db.close()
    sys.exit()   
    
client.username_pw_set("lqeamtbn", "vh0cU_Vcszxp")

try:
    client.loop_forever()
except KeyboardInterrupt:  #precionar Crtl + C para salir
    print("Cerrando...")
    db.close()

Python y Librerías:


Enlaces externos:

http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html

10 comentarios:

  1. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  2. que servidor externo podria funcionar???? ya probe infinitum y no funciona

    ResponderEliminar
  3. Muy buenos tutoriales Alejandro. Una consulta por favor, si quisiera hacer funcionar python desde un servidor remoto, que es necesario hacer? Ya que para que funcione en servidor local el script de python debe estar corriendo. Es necesario configurar o subir algo en el servidor remoto? Agradecere mucho tu ayuda. Saludos

    ResponderEliminar
  4. No es tan fácil, necesitas un servidor en el que corras Python en el backend. No creo que encuentres uno gratuito. Deberías hacerlo vos, o contratar algo en la nube. Saludos.

    ResponderEliminar
  5. Buenos dias! Muchas gracias por compartir tus conocimientos. consulta:

    me aparecen los feeds de esta manera con esa comilla (`) y no logro darme cuenta porqué. Los mensajes funcionan correctamente. Podrias darme una pista de que pueda estar pasando? Muchas gracias.

    ResponderEliminar
    Respuestas
    1. Me topé con tu mismo problema. Te paso solución.
      'bXXX'significa bytes . Debe convertir esto a UTF-8 antes de usarlo:

      msg.payload = msg.payload.decode("utf-8")

      Eliminar
    2. Excelente Nico, Muchas gracias!!

      Eliminar
  6. Adjunto out:

    feeds/casa/bridge/puerta/relay/0 b'0'
    feeds/casa/bridge/puerta/relay/1 b'0'
    feeds/casa/bridge/puerta/relay/2 b'0'
    feeds/casa/bridge/puerta/relay/3 b'0'
    feeds/casa/bridge/puerta/relay/4 b'0'
    feeds/casa/bridge/puerta/relay/5 b'0'
    feeds/casa/bridge/puerta/relay/6 b'0'
    feeds/casa/bridge/puerta/relay/7 b'0'
    feeds/casa/bridge/puerta/app b'ESPURNA'
    feeds/casa/bridge/puerta/version b'1.14.1'
    feeds/casa/bridge/puerta/board b'ITEAD_SONOFF_RFBRIDGE'
    feeds/casa/bridge/puerta/host b'RFBRIDGE'
    feeds/casa/bridge/puerta/ssid b'LOSLOPEZ'
    feeds/casa/bridge/puerta/ip b'192.168.1.242'
    feeds/casa/bridge/puerta/mac b'DC:4F:22:82:4A:70'
    feeds/casa/bridge/puerta/rssi b'-80'
    feeds/casa/bridge/puerta/uptime b'551105'
    feeds/casa/bridge/puerta/datetime b'2021-04-10 22:12:10'
    feeds/casa/bridge/puerta/freeheap b'18840'
    feeds/casa/bridge/puerta/vcc b'3223'
    feeds/casa/bridge/puerta/status b'1'
    feeds/casa/bridge/puerta/loadavg b'1'

    ResponderEliminar
  7. Have you ever been steadily winning taking part in} a certain amount|a specific amount|a sure quantity}, e.g., $1, so you resolve to bet more to win more and enhance your bet per spin to $2. The machine "instantly" stops paying and turns into deader than a Dodo bird! Strange, is not it, contemplating slots are alleged to be so-called "random" . Modern gaming machines use 카지노 사이트 laptop expertise to operate their capabilities.

    ResponderEliminar