sábado, 2 de septiembre de 2017

Tutorial #19 ESP8266 (Parte9) – MQTT – Enviar email usando Gmail y Python

Este es otro tutorial sobre internet de las cosas (IOT) usando MQTT en un ESP8266, en el que muestro como usar una script de Python que monitorea MQTT para enviar un email cuando la temperatura que lee el sensor LM35 supera un determinado valor.


tutorial19.py:

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

import paho.mqtt.client as mqtt
import sys
import smtplib
import mimetypes

global supero
supero = False

# 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("/")

    global supero

    if str(lista[2]) == "temperatura" and float(msg.payload) < 26:
       supero = False

    if supero == False and str(lista[2]) == "temperatura" and float(msg.payload) > 26:

        supero = True

        from email.MIMEText import MIMEText
     
        emisor = "____@gmail.com"
        receptor = "____@gmail.com"
        
        print("Enviando Email...")
     
        # Configuracion del mensaje
        mensaje = MIMEText("La temperatura de la " + lista[1] + " es de: " + str(msg.payload))
        mensaje['From']=emisor
        mensaje['To']=receptor
        mensaje['Subject']= "La temperatura de la " + lista[1] + " superó los 26ºC"
     
        try:
            # Nos conectamos al servidor SMTP de Gmail
            serverSMTP = smtplib.SMTP('smtp.gmail.com',587)
            serverSMTP.ehlo()
            serverSMTP.starttls()
            serverSMTP.ehlo()
            serverSMTP.login(emisor,"__password__")
            print("Conectado con exito al servidor SMTP...")
        except:
            print("Error al intentar conectarse al servidor SMTP...")
     
        try:
            # Enviamos el mensaje
            serverSMTP.sendmail(emisor,receptor,mensaje.as_string())
            # Cerramos la conexion
            serverSMTP.close()
            print("Email enviado con exito...")
        except:
            print("Error al intentar enviar el email...")

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...")

3 comentarios:

  1. Maestro le quiero agradecer la gran generosidad de compartir su conocimiento y trabajo. Le mando un cordial saludo.

    ResponderEliminar
  2. Buen día, se podría desarrollar MQTT en un host o servidor (no local) con nodeMCU, de pronto Socket, pero no utilice m13.cloudmqtt.com u otra plataforma IoT, en cambio el mismo host como en el que se muestra en el video que ejecuta los .php e index?

    ResponderEliminar
  3. Hola Todo me corre muy bien pero tengo un detalle:
    Y..bueno yo le puse enviar e-mail a los 36 °C....

    PORQUE sera??

    Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)] on win32
    Type "copyright", "credits" or "license()" for more information.
    >>>
    ===================== RESTART: C:\Python27\tutorial19.py =====================
    Conectado - Codigo de resultado: 5
    Conectado - Codigo de resultado: 0
    /placa2/temperatura 33.5
    /placa2/pulsador presionado
    /placa2/pulsador NO presionado
    /placa2/pulsador presionado
    /placa2/pulsador NO presionado
    /placa2/temperatura 31.3
    /placa2/temperatura 35.4
    /placa2/pulsador presionado
    /placa2/pulsador NO presionado
    /placa2/pulsador presionado
    /placa2/pulsador NO presionado
    /placa2/temperatura 32.3
    /placa2/salidaDigital ON
    /placa2/salidaAnalogica 0
    /placa2/salidaAnalogica 0
    /placa2/salidaAnalogica 1023
    /placa2/temperatura 38.3
    Enviando Email...

    Traceback (most recent call last):
    File "C:\Python27\tutorial19.py", line 81, in
    client.loop_forever()
    File "C:\Python27\lib\site-packages\paho_mqtt-1.3.1-py2.7.egg\paho\mqtt\client.py", line 1481, in loop_forever
    rc = self.loop(timeout, max_packets)
    File "C:\Python27\lib\site-packages\paho_mqtt-1.3.1-py2.7.egg\paho\mqtt\client.py", line 1003, in loop
    rc = self.loop_read(max_packets)
    File "C:\Python27\lib\site-packages\paho_mqtt-1.3.1-py2.7.egg\paho\mqtt\client.py", line 1284, in loop_read
    rc = self._packet_read()
    File "C:\Python27\lib\site-packages\paho_mqtt-1.3.1-py2.7.egg\paho\mqtt\client.py", line 1849, in _packet_read
    rc = self._packet_handle()
    File "C:\Python27\lib\site-packages\paho_mqtt-1.3.1-py2.7.egg\paho\mqtt\client.py", line 2305, in _packet_handle
    return self._handle_publish()
    File "C:\Python27\lib\site-packages\paho_mqtt-1.3.1-py2.7.egg\paho\mqtt\client.py", line 2500, in _handle_publish
    self._handle_on_message(message)
    File "C:\Python27\lib\site-packages\paho_mqtt-1.3.1-py2.7.egg\paho\mqtt\client.py", line 2647, in _handle_on_message
    self.on_message(self, self._userdata, message)
    File "C:\Python27\tutorial19.py", line 45, in on_message
    mensaje['Subject']= "La temperatura de la " + lista[1] + " superó los 36 ⁰C"
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 6: ordinal not in range(128)
    >>>
    Felicidades y Muchas gracias de antemano!!
    :-)

    ResponderEliminar