IFTTT: Apagando la luz con ESP32 y Touch Board

por | Mar 9, 2020 | Bareconductive, ESP32, IoT, LowJS | 0 Comentarios

IFTTT Apagando la luz con ESP32 (thumb)

Conociendo IFTTT

IFTTT es un servicio online que permite automatizar tareas en base a reglas que uno mismo configura. Sus iniciales son las siglas de If This, Then That, que traducido significa Si esto, entonces aquello. Lo cual nos da la idea que la forma de crear las reglas será ejecutar una acción cuando una determinada condición se cumpla.

Decenas de empresas como Twitter, Amazon, Google, Apple… tienen integración con esta plataforma. Esto permite que nuestro smartphone se ponga en silencio cuando llegamos a un determinado sitio, que cuando recibimos un correo de una dirección en concreto se anote un evento en el calendario, automatizar la subida de posts a instagram, y prácticamente todo lo que uno se pueda imaginar.

Y no sólo eso, sino que la mayoría de empresas con productos IoT como Amazon Echo, iRobot, Philips Hue, Yeelight… también están integradas. Así que también podemos programar nuestro robot aspirador para que se active cuando nos vamos de casa, que se encienda la calefacción de casa cuando estamos volviendo del trabajo, y un largo etcétera. Si quieres investigar más por tu cuenta puedes dirigirte al siguiente enlace.

Applets

La forma en la que configuraremos una acción para un determinado evento se llama applet. Cuando vayamos a crear una nueva lo primero que nos preguntará es la condición que se tiene que dar. Y por último, la acción que se realizará en caso de que se cumpla.

IFTTT: Apagando la luz con ESP32 y Touch Board

Webhooks

IFTTT ha pensado en la comunidad maker, y ha puesto a nuestra disposición algo llamado webhooks. Esto nos da la posibilidad de hacer una petición http GET ó POST y que en base a los parámetros que enviamos ejecute una acción que tengamos configurada. Más sencillo no lo podían poner.

IFTTT: Apagando la luz con ESP32 y Touch Board

Overview del proyecto

La visión general del proyecto es la siguiente. Vamos a conectar una bombilla inteligente al servicio IFTTT. Crearemos un par de applets para poder encender y apagar la bombilla mediante webhooks. Utilizaremos una hoja de papel con pintura conductiva como interruptor, conectada a la Touch Board. Y por último, apagaremos y encenderemos la luz desde nuestro ESP32 cada vez que se toque el papel.

IFTTT: Apagando la luz con ESP32 y Touch Board

Materiales y requisitos

Para el desarrollo del proyecto necesitaremos una Touch Board, un ESP32, un papel con pintura conductiva, una bombilla inteligente, y una cuenta en IFTTT. Es importante recalcar que el ESP32 debe tener LowJS flasheado, si no sabes cómo, encontrarás toda la información necesaria aquí. Y los pasos para abrir una cuenta en IFTTT son muy sencillos, como en cualquier otra web. Simplemente pulsas el botón Sign Up en la página de inicio, y eliges si registrarte de manera rápida con Google/Facebook, ó con correo y contraseña tradicional.

IFTTT: Apagando la luz con ESP32 y Touch Board
IFTTT: Apagando la luz con ESP32 y Touch Board
IFTTT: Apagando la luz con ESP32 y Touch Board
IFTTT: Apagando la luz con ESP32 y Touch Board
IFTTT: Apagando la luz con ESP32 y Touch Board

IFTTT Applets

Lo siguiente que tenemos que hacer, ya dentro de nuestra cuenta de IFTTT, es crear un par de applets. Una será la encargada de apagar la luz, y otra de encenderla. Hacemos click en el icono de nuestra cuenta, en el menú seleccionamos create, y hacemos click en this.

IFTTT: Apagando la luz con ESP32 y Touch Board
IFTTT: Apagando la luz con ESP32 y Touch Board

Usamos el buscador para filtrar por webhooks y hacemos click en la opción que nos saldrá.

IFTTT: Apagando la luz con ESP32 y Touch Board

Seleccionamos la opción Receive a web request

IFTTT: Apagando la luz con ESP32 y Touch Board

Elegimos el nombre del evento, que usaremos desde el ESP32, y le damos a Create trigger.

IFTTT: Apagando la luz con ESP32 y Touch Board

¡Ya tenemos la condición de nuestra applet! Ahora haremos click en That para seleccionar la acción que se realizará cuando se cumpla.

IFTTT: Apagando la luz con ESP32 y Touch Board

En la siguiente ventana tendremos que buscar el servicio con el que nos queremos conectar. Las bombillas Teckin que usaremos en este post se sincronizan mediante la app SmartLife, así que buscaremos este servicio. Si usáis otra aplicación porque vuestras bombillas son de otra marca, sólo tendréis que buscar su nombre (Philips Hue, Yeelight…).

IFTTT: Apagando la luz con ESP32 y Touch Board

El siguiente paso es conectar nuestra cuenta de SmartLife (o el servicio que hayáis elegido) con IFTTT. Para ello hacemos click en Connect y después introducimos las credenciales.

IFTTT: Apagando la luz con ESP32 y Touch Board
IFTTT: Apagando la luz con ESP32 y Touch Board
IFTTT: Apagando la luz con ESP32 y Touch Board

Una vez conectada la cuenta, veremos todas las acciones que tenemos disponibles. Elegimos Turn on.

IFTTT: Apagando la luz con ESP32 y Touch Board

Lo siguiente que tendremos que elegir seá el dispositivo sobre el que queremos realizar la acción seleccionada anteriormente. Tendremos un menú desplegable donde elegir el dispositivo de todos los que hayamos configurado desde la app de SmartLife. Una vez seleccionado hacemos click en Create action.

IFTTT: Apagando la luz con ESP32 y Touch Board

¡Ya lo tendríamos! En la siguiente pantalla veremos un resumen de la applet que hemos configurado. Revisamos que sea correcto y hacemos click en Finish.

IFTTT: Apagando la luz con ESP32 y Touch Board

Siguiendo estos mismos pasos, crearemos otra applet pero con el nombre del evento y la acción de SmartLife diferentes, esta vez para apagar la luz. Una vez lo tengamos, en el apartado de IFTTT My Applets deberíamos ver nuestras dos acciones creadas y listas para ejecutarse.

IFTTT: Apagando la luz con ESP32 y Touch Board
IFTTT: Apagando la luz con ESP32 y Touch Board

Esquema de conexiones

La idea principal es controlar cuando se toca el papel con la Touch Board, y transmitir la señal al ESP32. Éste, a su vez, estará encargado de hacer la petición web a IFTTT para que apague y encienda la luz cuando reciba la señal. A continuación podéis ver el esquema de conexiones que usaremos.

  • Touch Board pin papel -> E0
  • Touch Board pin RX -> 6
  • Touch Board pin TX -> 7
  • ESP32 pin RX -> 14
  • ESP32 pin TX -> 13
IFTTT: Apagando la luz con ESP32 y Touch Board

Código Touch Board

El código que cargaremos en la Touch Board es casi idéntico al del post de introducción a Bareconductive. La única diferencia es que cuando detectemos que se ha tocado el papel, enviaremos una señal por serial al ESP32, a través de los pines 6 y 7, declarados como RX y TX. Como señal utilizaremos la palabra touch.

touch_board.ino

#include <MPR121.h>
#include <Wire.h>
#include <SoftwareSerial.h>

SoftwareSerial mySerial(6, 7); // RX, TX

// Pin que usaremos para monitorizar los toques
#define SENSOR_PIN 0

// Dirección I2C por defecto en la placa Bare Touch Board
#define MPR121_I2C 0x5C

void setup() {
  // Se inicializa el Serial
  Serial.begin(115200);

  mySerial.begin(115200);

  // Se inicializa el sensor, y en caso de que falle se gestiona el error
  if (!MPR121.begin(MPR121_I2C)) {
    Serial.println("Error iniciando el sensor MPR121");

    // Se recupera y muestra el error generado
    switch (MPR121.getError()) {
      case NO_ERROR:
        Serial.println("Sin error");
        break;
      case ADDRESS_UNKNOWN:
        Serial.println("Dirección incorrecta");
        break;
      case READBACK_FAIL:
        Serial.println("Error de lectura");
        break;
      case OVERCURRENT_FLAG:
        Serial.println("Sobrecorriente en el pin REXT");
        break;
      case OUT_OF_RANGE:
        Serial.println("Pin fuera de rango");
        break;
      case NOT_INITED:
        Serial.println("No inicializado");
        break;
      default:
        Serial.println("Error desconocido");
        break;
    }
    while(1);
  }

  // Umbral de sensibilidad al pulsar
  // Cuanto más pequeño sea el valor más sensible será el sensor
  MPR121.setTouchThreshold(100);

  // Umbral de sensibilidad al soltar
  // Cuanto más pequeño sea el valor más sensible será el sensor
  // Este valor SIEMPRE deberá ser menor al umbral de pulsación
  MPR121.setReleaseThreshold(90);

  // Se actualizan los datos del sensor al iniciar
  MPR121.updateTouchData();
}

void loop() {
  // Se detecta si ha cambiado el estado de algún pin
  if (MPR121.touchStatusChanged()) {
    // Se actualizan los datos del sensor
    MPR121.updateTouchData();

    // Se comprueba si es un nuevo toque en nuestro pin
    if (MPR121.isNewTouch(SENSOR_PIN)) {
      // Se imprime la señal en el Serial normal como debug
      Serial.println("touch");
      // Se envía la señal al ESP32
      mySerial.println("touch");
    }
  }
}

Código ESP32

Para poder ejecutar las peticiones web a IFTTT primero vamos a necesitar conocer nuestra clave personal de webhook. Podemos consultarla en el apartado de webhooks, haciendo click en el botón Documentation. Desde el mismo enlace hay un ejemplo de cómo deberemos hacer la petición, donde {event} en nuestro caso se sustituiría por LightOnLightOff.

IFTTT: Apagando la luz con ESP32 y Touch Board
IFTTT: Apagando la luz con ESP32 y Touch Board

Ahora crearemos una carpeta donde sincronizaremos el proyecto del ESP32. En ella crearemos un archivo llamado index.js con el siguiente contenido.

index.js

// Módulo nativo para gestionar conexiones UART
const uart = require('uart');
// Módulo nativo para gestionar streams
const readline = require('readline');
// Módulo de NodeJS para hacer peticiones HTTP con promesas
const axios = require('axios');
// Key personal de IFTTT Webhooks
const ifttt_key = "<IFTTT_KEY>";

// Palabra que esperamos recibir de la Touch Board
const TOUCH_COMMAND = 'touch';

// Estado de la luz
let state = 'OFF';

// Nombre de los eventos en IFTTT
const hooks = {
	on: 'LightOn',
	off: 'LightOff'
};

// Conexión serial con Touch Board
const stream = new uart.UART({
  pinRX: 14,
  pinTX: 13,
  baud: 115200
});

// Lector para la conexión serial
const rl = readline.createInterface({
  input: stream
});

// Cada vez que se recibe una línea del serial
rl.on('line', (data) => {
	// Si la palabra recibida es nuestro comando
	if (data === TOUCH_COMMAND) {
		// Variable donde montaremos la dirección web a la que llamar
		let url;
		
		console.log('¡Comando recibido!');

		// Si el estado actual de la luz es Encendida
		if (state === 'ON') {
			// Se monta la url con el hook de apagar
			url = `https://maker.ifttt.com/trigger/${hooks.off}/with/key/${ifttt_key}`;
			// Se actualiza el estado de la luz
			state = 'OFF';
		}
		// Si el estado actual de la luz es Apagada
		else if (state === 'OFF') {
			// Se monta la url con el hook de encender
			url = `https://maker.ifttt.com/trigger/${hooks.on}/with/key/${ifttt_key}`;
			// Se actualiza el estado de la luz
			state = 'ON';
		}

		// Se hace la petición web a la url montada
		axios.get(url)
		.then(response => {
			// Se muestra por consola la respuesta del servidor
			console.log(response.data);
		})
		.catch(error => {
			// Se muestra por consola el error (en caso de que haya)
			console.log(error);
		});
	}
});

Para terminar, sincronizamos el proyecto con el comando lowsync sync. Si tienes alguna duda sobre cómo usar los comandos o de cómo crear/sincronizar un proyecto con LowJS no dudes en consultar la documentación oficial o el post de introducción a LowJS.

Resultado

Una vez tengamos el circuito montado resetearemos las dos placas con sus correspondientes botones. Cuando terminen de reiniciarse ya podremos observar cómo se enciende y apaga la bombilla cuando tocamos el papel 🤩.

IFTTT: Apagando la luz con ESP32 y Touch Board

Recursos

Puedes descargar los recursos del post desde el siguiente enlace. ¡No te olvides de compartir si te ha gustado!