Usa Telegram con ESP8266 o ESP32

Publicado por Loli Diéguez en

Telegram es una aplicación similar a 'Whatsapp' para que los teléfonos móviles intercambien mensajes.

Una ventaja que tiene sobre Whatsapp o Viber es que también te permite comunicarte con tu mini ordenador. Esto significa que tu teléfono puede recibir mensajes enviados desde tu ESP8266 o ESP32, pero también que tu teléfono puede usarse para controlar tu ESP8266 o ESP32.

Para hacerlo, debes tener instalada la aplicación de Telegram, crear tu propio bot para manejar el tráfico, obtener una API_key y el chat_id para tu bot.

 

Bienvenido a Telegram Bot

 

Instala Telegram

Visita el sitio web oficial de Telegram y descarga la aplicación oficial para tu teléfono inteligente.

Crea tu bot

Crea tu bot usando un bot llamado "BotFather". Para hacer esto, agrega BotFather a tus contactos o visita telegram.me/botfather y sigue las instrucciones que te indican para crear tu propio bot.

Obten tu API

Cuando creas tu bot, BotFather te proporciona el token de API HTTP que sigue un patrón como 123456789: AABBCCDD_abcdefghijklmnopqrstuvwxyz. 

Necesitas este token para enviar mensajes.

Obten tu chat_id

Necesitarás esta identificación para enviar mensajes, pero no la necesitas para recibir mensajes. Obtener esta identificación no es sencillo y la mayoría de los métodos que he visto en Internet ya no funcionan.

Los únicos que encontré funcionando es el IDBot y el get_id_bot. Sin embargo, este último puede ser un poco lento. (Mencionaré una tercera opción más adelante).

 

Pantalla de obtener el chat_id

 

Obtener tu ID de chat con IDBot.

 

Obtener el ID con el bot get_id

La identificación es un número entero y sigue un patrón como 123456789.

Ahora es el momento de probar tu bot.

Puedes hacer esto con cURL

curl --data chat_id = "892915001" --data "text = Hola mundo" "https://api.telegram.org/bot977142506:AAGYWypUbMN8BCthML-tFM25M403r2yCsFj/sendMessage
Desde la línea de comandos, o con una URL GET en un navegador como este:
https://api.telegram.org/bot977142506:AAGYWypUbMN8BCthML-tFM25M403r2yCsFj/sendMessage?chat_id=892915001&text=Hello-World

Hay otro elemento que se puede agregar al final y es &parse_mode=, pero para operaciones normales podemos dejarlo fuera o convertirlo en “&parse_mode=HTML”. (Un poco más sobre esto más adelante).

Usando GET

Ahora que tenemos nuestra comunicación con Telegram funcionando, podemos hacer algo útil con él.

El hecho de que se pueda acceder a la API con un mensaje GET abre posibilidades para un ESP8266, ESP32, Raspberry Pi u otro controlador que esté conectado a Internet.

Harías esto de la siguiente manera:
botclient.print (String ("GET") + url + "HTTP/1.1\r\n" +
"Host:" + host+ "\r\n"+
"User-Agent: BuildFailureDetectorESP8266\r\n" +
"Connection: cerrar\r\n\r\n");
En el cual
const char * host = "api.telegram.org"

String url es la suma de las cadenas y variables que deseas enviar.

En la sección de declaración, estarías indicando:
WiFiClientSecure botclient;

La razón por la que no estoy poniendo un programa completo y listo "Telegram vía GET" aquí es porque en realidad hay un programa de biblioteca bastante decente disponible, la cual veremos en el siguiente punto.

Uso de una biblioteca

Hay varias bibliotecas para Telegram disponibles y probablemente ya las hayas encontrado en el administrador de tu biblioteca. 

El "UniversalTelegramBot" es bastante decente y los ejemplos deberían ayudarte a comenzar a trabajar rápidamente, incluso si a primera vista no siempre está claro lo que haces.

Por lo tanto, instala la biblioteca a través del administrador de la biblioteca y veamos un ejemplo de “PhotoFromURL”.

Cuando completes tus credenciales de WiFi y la API de Telegram, puedes preguntarte "¿a dónde va mi chat_id?".

Bueno, ¿recuerdas que antes te dije que solo necesitabas el chat_id cuando querías enviar algo desde tu micro ordenador a tu teléfono? Bueno, este es el caso.

"Sí, pero se supone que este programa me envía algo y veo claramente una variable llamada chat_id, así que ¿dónde pongo la mía?", te escucho decir.

Bueno, este programa te enviará una imagen SOLAMENTE cuando le digas que lo haga y luego el programa simplemente leerá tu chat_id del mensaje entrante y lo usará. Este es también el tercer método para encontrar tu ID de cliente.

Entonces, esto es lo que debes hacer para usar este ejemplo: después de cargarlo en tu ESP8266, ves a la aplicación Telegram en tu teléfono. Selecciona el bot que acabas de crear para enviar un mensaje y un message /start.

Después de unos momentos, el bot responde con una descripción general de los comandos que puede dar (solo uno en este caso). Toque ese comando para ejecutarlo.

¿No funciona?

Si no pasa nada, es hora de abrir el monitor en serie.

Deberías ver el número de IP que se está imprimiendo. Asegúrate de escribir el comando correcto en tu aplicación de Telegram y asegúrate de enviarlo al bot adecuado.

Si no ves aparecer el mensaje de 'respuesta obtenida' y estás seguro de haber insertado la API correcta, entonces aparentemente algo más impide que el programa abra un socket al bot.

¿Podría ser que todavía estés usando el núcleo 2.5.0 ESP8266? Hay muchas buenas razones para usar ese núcleo, pero aparentemente tiene un problema con las conexiones seguras. Pero no todo está perdido, aquí está lo que debes hacer:

Vete a setup() y agrega:

client.setInsecure ();

Luego compila y carga el archivo nuevamente.

¡Ten cuidado! En este ejemplo, el cliente se llama WiFiSecure(). Eso puede ser diferente en otros ejemplos (en el caso de Bulkmessages se llama 'secure_client'). Cambia la declaración setInsecure acorde al metodo que usaras.

Controlar tu ESP8266 / ESP32 a través de Telegram

Es posible controlar tu ESP a través de tu aplicación de Telegram. De hecho, eso es lo que ya estaba haciendo con el ejemplo anterior: le ordenamos que enviara una foto.

El ejemplo de FlashLed muestra muy claramente cómo controlar tu ESP. Si para la prueba deseas utilizar el led incorporado de Wemos, el ledPin debe ser '2', la rutina de ledon debe hacer que el pin sea LOW y la rutina de ledoff debe hacer que el pin sea HIGH.

Podrías combinar funciones como esta:

/**********************************************
* Cómo usar las funciones básicas de un Telegrambot 
* Un ejemplo completamente cambiado basado en un boceto de   
* Vadim Sinitski
**********************************************/
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>

// Initialize Wifi connection to the router
char ssid[] = "NETGEAR1";     // your network SSID (name)
char password[] = "SECRET"; // your network key

// Initialize Telegram BOT
#define BOTtoken "XXXXXXXXX:YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"  // your Bot Token (Get from Botfather)

WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);

int Bot_mtbs = 1000; //mean time between scan messages
long Bot_lasttime;   //last time messages' scan has been done
bool Start = false;

const int ledPin = 2;
int ledStatus = 0;

String test_photo_url = "https://img.srgcdn.com/e/w:750/cjh2NWp4S0FiNWxJQVNsQ3JUU28uanBn.jpg"; // can insert any picture URL

void handleNewMessages(int numNewMessages) {
  Serial.println("handleNewMessages");
  Serial.println(String(numNewMessages));


  for (int i = 0; i < numNewMessages; i++) {
    String chat_id = String(bot.messages[i].chat_id);
    String text = bot.messages[i].text;

    String from_name = bot.messages[i].from_name;
    if (from_name == "") from_name = "Guest";

    if (text == "/get_photo") {
      bot.sendPhoto(chat_id, test_photo_url, "Who");
    }

    //-------------
    //add more commands here
    //-------------
    
    if (text == "/ledon") {
      digitalWrite(ledPin, LOW);   // turn the LED on (HIGH is the voltage level)
      ledStatus = 1;
      bot.sendMessage(chat_id, "Led is ON", "");
    }

    if (text == "/ledoff") {
      ledStatus = 0;
      digitalWrite(ledPin, HIGH);    // turn the LED off (LOW is the voltage level)
      bot.sendMessage(chat_id, "Led is OFF", "");
    }

    if (text == "/status") {
      if (ledStatus) {
        bot.sendMessage(chat_id, "Led is ON", "");
      } else {
        bot.sendMessage(chat_id, "Led is OFF", "");
      }
    }
    

    if (text == "/start") {
      String welcome = "Welcome to Telegram Bot, " + from_name + ".\n";
      welcome += "This will show several properies.\n\n";
      welcome += "/get_photo : getting photo\n";
      welcome += "/ledon : to switch the Led ON\n";
      welcome += "/ledoff : to switch the Led OFF\n";
      welcome += "/status : Returns current status of LED\n";


      bot.sendMessage(chat_id, welcome, "");
    }
  }
}

void setup() {
  Serial.begin(115200);

  // Set WiFi to station mode and disconnect from an AP if it was Previously connected
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);

  // attempt to connect to Wifi network:
  Serial.print("Connecting Wifi: ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  client.setInsecure(); // if yr core cannot handle secure connections

  pinMode(ledPin, OUTPUT); // initialize digital ledPin as an output.
  delay(10);
  digitalWrite(ledPin, HIGH); // initialize pin as off

}

void loop() {
  if (millis() > Bot_lasttime + Bot_mtbs)  {
    int numNewMessages = bot.getUpdates(bot.last_message_received + 1);

    while (numNewMessages) {
      Serial.println("got response");
      handleNewMessages(numNewMessages);
      numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    }

    Bot_lasttime = millis();
  }
}

 

Solo quiero que mi ESP envíe notificaciones

Bueno, de hecho, los ejemplos anteriores hicieron eso, pero si realmente solo deseas que se envíen notificaciones a tu teléfono desde tu ESP, entonces el único comando que necesitarás de la biblioteca es:

bot.sendMessage (chat_id, "Mi mensaje", "");

Siempre que, por supuesto, hayas llamado "bot" a tu objeto de biblioteca. Esas comillas vacías al final están ahí para parse_mode. En lugar de "mi mensaje", también puedes insertar una variable de cadena en la que agregar texto y variables e incluso puedes usar codificación HTML simple en esa cadena. 

En ese caso, el comando debe ser:

bot.sendMessage (chat_id, messagestring, "HTML");
La cadena de mensajes podría ser, por ejemplo:
String messagestring = "La temperatura es <b>" + String (tempreading + "</b> Celsius";

nota: imagen de portada

SI QUIERES MÁS ARTÍCULOS COMO ESTE LO PUEDES VER AQUÍ


Compartir esta publicación



← Publicación más antigua Publicación más reciente →