https://d226lax1qjow5r.cloudfront.net/blog/blogposts/home-automation-using-esp32-and-vonage-sms-api/home-automation_vonagesms.png

Domótica con ESP32 y SMS API de Vonage

Publicado el August 24, 2023

Tiempo de lectura: 5 minutos

Introducción

El Internet de las cosas (IoT) se ha hecho cada vez más popular en los últimos años, con dispositivos inteligentes que permiten a las personas controlar de forma remota varios aspectos de sus hogares. Vonage es una plataforma de comunicación en la nube que permite a las empresas conectar con sus clientes a través de SMS, voz y aplicaciones de mensajería.

Este artículo explorará cómo usar Vonage SMS para la automatización del hogar usando el microcontrolador ESP32. Te guiaremos por los pasos para configurar el sistema y te explicaremos cómo funciona. El objetivo es controlar los dispositivos domésticos usando ESP32 con un SMS enviado a tu teléfono usando la API SMS de Vonage.

Requisitos previos

Descripción técnica de la aplicación

La SMS API de Vonage se comunicará con el ESP32 mediante un webhook. Cuando Vonage reciba un SMS, enviará una solicitud POST al punto final del ESP32 a través del webhook.

Luego, el ESP32 analizará la carga útil JSON, realizará una función digitalWrite() y devolverá una solicitud POST a la SMS API de Vonage con el estado de la operación (éxito/fracaso), para que el usuario final sepa qué sucedió.

A diagram showing the process: Vonage SMS API sends a request to Ngrok - Ngrok sends it to ESP32, and ESP32 sends it back to Vonageapplication-overview-diagram.png

Paso 1: Cómo configurar el gestor de peticiones ESP32

Para empezar, debe instalar el ArudinoJson y ESPAsyncWebSrv . Estas bibliotecas te permitirán manejar las solicitudes entrantes de la SMS API de Vonage.

  1. Abra el IDE de Arduino

  2. Abra el Library Manager del panel izquierdo.

  3. Buscar ArduinoJson

Showing ArduinoJson in the Arduino IDEarduinojson-arduino-ide.png

  1. Pulse Install

  2. Buscar ESPAsyncWebSrv

Showing ESPAsyncWebSrv in the Arduino IDEespasyncwebsrv-arduino-ide.png

  1. Pulse Install

Una vez que hayas instalado las librerías, puedes configurar el WiFi y el manejador de peticiones. El gestor de peticiones gestionará las peticiones entrantes y las dirigirá a la función adecuada.

Cree un nuevo archivo (sketch) yendo a File > New Sketch. A continuación, incluya todas las bibliotecas a continuación.

#include "AsyncJson.h"
#include "ArduinoJson.h"
#include "ESPAsyncWebSrv.h"

A continuación, inicialice el servidor web.

AsyncWebServer server(80);

Añadir credenciales WiFi.

const char *ssid = "Your WiFi name here";
const char *password = "Your WiFi password here";

Añadir una función fallback para manejar 404 peticiones.

void onRequest(AsyncWebServerRequest *request) {
    request->send(404);
}

Ahora, añade una función setup() para manejar toda la lógica, empezando por la configuración WiFi.

void setup() {
    // Start a serial connection at a 115200 baud rate
    Serial.begin(115200);
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    if (WiFi.waitForConnectResult() != WL_CONNECTED) {
        Serial.printf("WiFi Failed!\n");
        return;
    }
    Serial.println(WiFi.localIP());
    WiFiClient client;
    HTTPClient http;
}

Luego, dentro de la función setup() crearás un punto final para gestionar el JSON entrante de Vonage.

AsyncCallbackJsonWebHandler *handler = new AsyncCallbackJsonWebHandler("/inbound", [](AsyncWebServerRequest *request, JsonVariant &json) {

Empezar a crear un documento JSON dinámico dentro del archivo *handler.

DynamicJsonDocument doc(2048)

Ahora, comprueba si hay errores de deserialización. Estos no deberían ocurrir, pero debemos manejarlos para que los núcleos de ESP32 no entren en pánico.

DeserializationError error = deserializeJson(doc, json); if (error) {
    // Handle the error
    Serial.println(error.c_str()); request->send(400, "text/plain", "Invalid JSON payload"); return;
}

Continúa con la creación de un objeto JSON.

JsonObject jsonObj = doc.as();

Para simplificar las cosas, sólo analizaremos la clave text de la carga útil, que indica qué hacer con el dispositivo que vamos a controlar.

String text = jsonObj["text"].as();

Eso es todo para la parte de manejo de JSON. Para controlar un pin digital, agrega algo de lógica condicional que enviará una solicitud a Vonage dependiendo del contenido del texto. Por ejemplo, si el usuario envía "ON", el controlador de solicitudes enviará el mensaje "¡Encendido!" a Vonage.

Un pin digital en el ESP32 es un pin que se puede establecer en uno de dos estados: ALTO (1) o BAJO (0). Se puede utilizar para diversos fines, como leer el estado de un sensor (entrada digital) o controlar el estado de un actuador (salida digital).

if (text == "ON") {
    digitalWrite(controlPin, HIGH);
    request->send(200, "text/plain", "Turned ON!");
} else {
    digitalWrite(controlPin, LOW);
    request->send(200, "text/plain", "Turned OFF!");
}

Añade los manejadores finales del servidor fuera del *handler para terminar.

server.addHandler(onBody);
server.addHandler(handler);
server.onNotFound(onRequest);
server.begin();

Para que esto funcione necesitamos definir este pin digital. Podemos hacerlo después de incluir las librerías al principio del código.

#include "AsyncJson.h"
#include "ArduinoJson.h"
#include "ESPAsyncWebSrv.h"
#define controlPin 13

Paso 2: Cómo configurar ESP32 Request Sender

Ahora que has configurado el controlador de solicitudes, una vez que se haya actualizado el pin, puedes solicitar la SMS API de Vonage con el estado de la operación (éxito/fracaso). Agrega la siguiente configuración al comienzo del código.

const char *ssid = "Your WiFi name here";
const char *password = "Your WiFi password here";
#define API_ENDPOINT = "https://rest.nexmo.com/sms/json"
#define FROM = "$VONAGE_BRAND_NAME"
#define TO = "Your phone number"
#define API_KEY = "$VONAGE_API_KEY"
#define API_SECRET = "$VONAGE_API_SECRET"

Crea una nueva función que enviará solicitudes a Vonage.

bool requestSender (String state) {
    http.begin(client, API_ENDPOINT.c_str());
    http.addHeader('Content-Type', 'application/json');
    String httpRequestData = "{\"from\":\"" + FROM.c_str() + "\",\"text\":\"," + state.c_str() + "\"\"to\":\"" + TO.c_str() + "\",\"api_key\":\"" + API_KEY.c_str() + "\",\"api_secret\":\"" + API_SECRET.c_str();
    int httpResponseCode = http.POST(httpRequestData);
    http.end();
    if (httpResponseCode == 200) return true;
    return false;
}

Para que la petición no se cuelgue, añade una función simple basada en el estado.

void manageState (bool state, AsyncWebServerRequest *request) {
    if (state) {
        request->send(200, "text/plain", stateText);
        return;
    }
    request->send(200, "text/plain", "Something went wrong");
    return;
    }

Incorpore todo esto en *handler donde ocurre la lógica condicional.

bool state = false;
String stateText = "";
if (text == "ON") {
    digitalWrite(controlPin, HIGH);
    stateText = "Turned ON!";
    Serial.println(stateText);
    state = requestSender(stateText);
    manageState(state);
} else {
    digitalWrite(controlPin, LOW);
    stateText = "Turned OFF!";
    Serial.println(stateText);
    state = requestSender(stateText);
    manageState(state);
}

Paso 3: Cómo configurar Ngrok con ESP32

Para probar el webhook localmente, puede utilizar ngrok. Ngrok te permitirá exponer tu punto final local a Internet y recibir solicitudes entrantes de la SMS API de Vonage.

Puede instalar y ejecutar ngrok localmente en su ordenador. Para instalar ngrok, vaya a la página de descargas de página de descarga de ngrok. Siga las instrucciones específicas del sistema operativo proporcionadas por ngrok.

ngrok Download Pagengrok-download-page.png

A continuación, enciende tu ESP32 y espera a que se conecte a la red. Conéctalo a un puerto USB de tu ordenador y abre el Serial Monitor dentro de Arduino IDE.

Desde el monitor serie, copie la dirección IP del ESP32 que se muestra al arrancar.

ESP32's Local IP Address shown inside Arduino IDE's Serial Monitoresp32-local-ip-arduino-ide.png

Ahora, abre una nueva ventana de terminal en tu ordenador. Ejecute ngrok http <esp32-ip-address>:80. Sustituye <esp32-ip-address> por la dirección IP local de tu ESP32.

Por ejemplo, ngrok http 10.10.1.10:80. ngrok ahora abrirá un túnel de acceso público a su ESP32.

ngrok CLI Tunnel information shown inside a terminal windowngrok-cli-output-terminal.png

Paso 4: Cómo configurar Vonage Webhook

Ahora que has configurado el ESP32 y el túnel ngrok, puedes configurar el webhook de Vonage. El webhook enviará los mensajes SMS entrantes al túnel ngrok, que los reenviará al ESP32.

Puedes configurar el webhook en el panel de control de tu Account de Vonage proporcionando la URL del túnel ngrok. Ve a Configuración de Vonage. En la pestaña Claves de API, busca la configuración de SMS. En Configuración de SMS, establece SMS API y el formato de webhook en POST-JSON.

De vuelta en su ventana de terminal, copie la Forwarding URL.

ngrok Forwarding URL shown inside a terminal windowngrok-forwarding-url-terminal.png

En la configuración de Vonage, pega lo siguiente /rest/endpoint en webhooks de SMS entrantes. Por ejemplo, https://b462-31-223-156-70.ngrok-free.app/rest/endpoint.

Pulse Guardar cambios en la esquina superior derecha para guardar el webhook.

Paso 5: Probar la aplicación

Enviar un SMS que contenga ON o OFF desde tu número de teléfono a cualquier número de Vonage.

Después de que Vonage termine de procesar la solicitud, deberías ver un cambio en el dispositivo que estás controlando (por ejemplo, una bombilla) y la salida respectiva en el monitor serial de Arduino IDE.

Serial output from ESP32 shown in the Arduino IDEserial-out-esp32-in-ide.png

A continuación, debería recibir un SMS de confirmación sobre el estado de la operación.

Próximos pasos y recursos

Puedes explorar sistemas de domótica más avanzados utilizando el ESP32 y la API SMS de Vonage. También puedes consultar la Documentación para desarrolladores de Vonage para obtener más información sobre el uso de la API de Vonage.

Para obtener más información sobre ESP32, puede leer la documentación oficial de ESP-IDF oficial.

Conclusión

El uso de Vonage SMS para la automatización del hogar con el microcontrolador ESP32 es una manera poderosa y conveniente de controlar varios aspectos de tu hogar de forma remota. Siguiendo los pasos descritos en este tutorial, puedes configurar un sistema básico y ampliarlo para adaptarlo a tus necesidades.

Si tienes preguntas o comentarios, únete a nosotros en el Slack para desarrolladores de Vonage o envíanos un Tweet en Twittery te responderemos. Gracias de nuevo por leer, ¡y te esperamos en el próximo!

Compartir:

https://a.storyblok.com/f/270183/398x400/d25c3f913d/dejan-lukic.jpg
Dejan LukićAutor invitado

Dejan es un desarrollador backend y redactor técnico reconvertido en empresario con casi una década de experiencia. A los 13 años desarrolló un satélite CubeSat, y a los 16 tuvo que incorporarse al extranjero para dedicarse al emprendimiento. Actualmente dirige una agencia de contenidos técnicos, NXNE. Es más activo en LinkedIn y ocasionalmente utiliza Twitter.