Requisitos
Un ESP32, ESP8266 o cualquier otro dispositivo basado en esos dos chips con una versión de firmware Tasmota actualizada
Una conexión a internet inalámbrica
Cables de conexión
Tabla de Contenidos
1. Configurando los GPIOs para los sensores
Este artículo asume que ya tienes un dispositivo ESP ejecutando el firmware Tasmota. Puedes aprender a flashear Tasmota en tu dispositivo en un par de minutos siguiendo esta guía.
Primero que nada, necesitaremos entrar al dashboard de nuestro dispositivo y, para hacerlo, necesitamos conocer su dirección IP en la red Wi-Fi local. Si no recuerdas su dirección IP, puedes conocerla haciendo lo siguiente:
Si estás ejecutando alguna distribución de Linux, puedes abrir tu consola de comandos y escribir el comando “ip addr”. Este comando te permitirá conocer tu dirección IP, con la cual podrás inspeccionar los dispositivos conectados a tu red local. Después de ejecutar el comando, los siguientes datos deberían mostrarse:
La información de la interfaz inalámbrica de tu PC está bajo la sección etiquetada como "wlp3s0". El número encerrado en el cuadro rojo es tu dirección IP y tu máscara de subred. Usaremos ese número para escanear los dispositivos en nuestra red local, así que cópialo.
Ahora, en la misma consola de comandos, ejecutemos el siguiente comando reemplazando <tu-dirección-ip> por el número que copiaste en el paso anterior.
sudo nmap -sn <tu-dirección-ip>
Después de ejecutar el comando anterior, se mostrará una lista de los dispositivos conectados a tu red local, allí tendrás que buscar un dispositivo llamado algo como “Espressif”
Consejo profesional: Si no tienes instalada la utilidad "nmap", puedes hacerlo ejecutando “sudo apt install nmap”. ¡Solo toma un par de segundos!
Ahora que conoces la dirección IP de tu dispositivo, puedes dirigirte al dashboard de Tasmota usando tu navegador web para ir a la dirección que acabas de obtener. La dirección IP asignada al dispositivo utilizado para esta guía es “192.168.1.35”, así que al escribir esto en la barra de búsqueda del navegador, se mostrará la siguiente pantalla:
Ahora, aquí es donde se lleva a cabo la configuración real de los GPIO. Por favor, haz clic en la opción “Configuración” y se cargará la siguiente página en tu navegador web:
Haz clic en “Configurar Módulo” para proceder al siguiente paso de configuración. Se mostrará una nueva pantalla con todas las opciones de configuración para el tipo de dispositivo, y las diversas funciones y sensores GPIO soportados por Tasmota. Hoy trabajaremos con dos sensores diferentes para transmitir datos a Ubidots. El siguiente GIF te muestra cómo configurar los GPIOs para esos sensores:
Nota que después de configurar los GPIOs, ciertos datos se muestran en la página principal del dashboard de la siguiente manera:
¡Ese es precisamente el dato que tenemos que transmitir a Ubidots!
2. Configurar los Parámetros MQTT para Establecer Conexión con Ubidots
Ahora que tenemos los datos para ingerir en Ubidots, solo queda configurar la conexión MQTT para transmitir los datos a Ubidots. Para hacerlo, dirígete a la opción “Configuración” en la página principal del dashboard, y luego, en la pantalla recién cargada, ve a “Configurar MQTT”. Se mostrará la siguiente pantalla:
Solo necesitamos configurar los parámetros encerrados en los cuadros rojos. Ten cuidado al hacerlo: errores tipográficos aquí invalidarán cualquier paso posterior y solo se notarán al final, cuando no se reciban datos en Ubidots. Los parámetros de la imagen anterior deben configurarse de la siguiente manera:
Host: Escribe “functions.ubidots.com”. Este es el endpoint al que el protocolo MQTT publicará al transmitir datos.
Puerto: Déjalo en su valor predeterminado.
Cliente: Déjalo en su valor predeterminado.
Usuario: Aquí va tu nombre de usuario de la cuenta de Ubidots.
Contraseña: Aquí va tu Token personal de Ubidots. Aprende cómo encontrar tu Token aquí.
Tema: Esto depende de ti y de lo que se adapte a tu implementación. Sin embargo, en este artículo usaremos un identificador para el tipo de dispositivo como tema, “esp8266_office”. La razón será clara pronto.
Tema Completo: Elimina todo el contenido de este campo, y luego escribe lo siguiente: /prv/tu-nombre-de-usuario/tasmota/%topic%/. Por ejemplo, si tu nombre de usuario de Ubidots es “johnDoe”, entonces tu Tema Completo debería ser /prv/johndoe/tasmota/%topic%/
Ahora puedes presionar el botón “Guardar” para continuar al siguiente paso.
3. Creando la UbiFunction que Manejará los Datos que Van a Ubidots
Hasta este punto, los datos se están ingiriendo en la plataforma Ubidots a través del endpoint configurado en el paso anterior cada vez que Tasmota publica. Sin embargo, debido al formato de la carga útil de Tasmota, necesitamos filtrar los datos de nuestro interés. Para lograr esto, dirígete a tu cuenta de Ubidots y crea una UbiFunction desde la sección “Dispositivos” haciendo clic en el botón "+" en la parte superior derecha de la pantalla.
Después de hacer clic en “Crear Función”, se mostrará la siguiente página en tu navegador.
Configura los ajustes anteriores de la siguiente manera:
Nombre: escribe el nombre de la UbiFunction. Esto está directamente relacionado con los parámetros MQTT configurados en el paso anterior, así que escribe “Tasmota” en el campo de nombre de la función.
Método: selecciona la opción “POST” del menú desplegable.
Runtime: selecciona “Python 3.7”.
Token: selecciona la opción “Token Predeterminado” del menú desplegable, esto usará tu Token personal de Ubidots por defecto.
En la sección de código, borra todo el contenido predeterminado y pega el siguiente código allí.
import requestsdef main(args: dict = {}): #obtiene el subtema de Tasmota. Ej: SENSOR, STATE, SWITCH, etc. fullTopic = args['topic'] fullTopic = fullTopic.rsplit("/", 2) #este es en realidad el subtema de Tasmota topic = fullTopic[-1] #este es el nombre del dispositivo device = fullTopic[-2] #este es tu token de Ubidots token = args.get("_auth_token") #esta será la carga útil a enviar payload = {} publish = False #Este es un publish relacionado con el estado de tasmota, no en realidad #datos del sensor, así que enviaremos una carga útil "vacía". if(topic == 'STATE'): publish = True payload = { "trigger":{ "value":0, "context":{ "source":"tasmota-status-update" } } }; #esto es en realidad un flujo de datos del sensor #esto sucede cada telePeriod elif(topic == 'SENSOR'): publish = True payload = { "trigger":{ "value":1, "context":{ "source":"tasmota-telemetry-period-update" } }, "DS18B20-temperature":{ "value":args["payload"]["DS18B20"]["Temperature"], "context":{ "source":"tasmota-telemetry-period" } }, "DHT-temperature":{ "value":args["payload"]["AM2301"]["Temperature"], "context":{ "source":"tasmota-telemetry-period" } }, "DHT-humidity":{ "value":args["payload"]["AM2301"]["Humidity"], "context":{ "source":"tasmota-telemetry-period" } }, "DHT-dew-point":{ "value":args["payload"]["AM2301"]["DewPoint"], "context":{ "source":"tasmota-telemetry-period" } }, }; if(publish): res = make_request( "POST", f"https://industrial.api.ubidots.com/api/v1.6/devices/{device}", headers={"X-Auth-Token": token}, body_json = payload, ) #Este tema se envía cada telePeriod y reporta el estado de tasmota print(f"args: {args}") print(f"topic: {topic}") print(f"device: {device}") return {"published":publish}def make_request( method, url, params=None, headers=None, body=None, body_json=None, attempts=1, timeout=10,): """ Función para hacer una solicitud con tiempo de espera y reintentos """ req_session = requests.Session() req_adapter = requests.adapters.HTTPAdapter(max_retries=attempts) req_session.mount("https://", req_adapter) response = req_session.request( method=method.upper(), url=url, params=params, headers=headers, data=body, json=body_json, timeout=timeout, ) req_session.close() response.raise_for_status() return response
Después de pegar el código en el campo de texto correspondiente, puedes presionar el botón “Hacerlo en vivo”.
4. Visualizando los Datos en Ubidots
Dirígete a la sección “Dispositivos” en tu cuenta de Ubidots y allí verás un nuevo dispositivo creado etiquetado como “esp8266_office”. Haz clic en él y verás los datos.