, , ,

Enviar mensajes desde el ESP8266 mediante Telegram

Lo primero que necesitamos en crear nuestro propio bot. Para ello instalamos Telegram en nuestro móvil e iniciamos un chat con @BotFather.

Una vez que hemos escrito algo en nuestro chat con el bot procederemos a ver como podemos conocer el identificador (chat_id) ya que lo vamos a necesitar posteriormente . Para ello abrimos nuestro navegador y escribimos lo siguiente :

https://api.telegram.org/bot<token>/getUpdates?offset=0 

donde token es el identificador que nos había enviado el @bootFather.

Un ejemplo sería :

https://api.telegram.org/bot266211256:ABE1X7V2MJSxOVB-iK_a_4dXi6f0Uf405hj/getUpdates?offset=0

y en el navegador aparecería un resultado como el siguiente:

{"ok":true,"result":[{"update_id":546293813,
"message":{"message_id":29,"from":{"id":546293813,"first_name":"Intrusos"},"chat":{"id":204236614,"first_name":"Intrusos","type":"private"},"date":1473372888,"text":"Hola"}}]}

donde podemos observar que el chat_id es →204236614

Una vez creado nuestro bot vamos a utilizar el mismo circuito que utilizamos para el servidor web, pero ahora haremos que nos envié la temperatura y la humedad cuando se lo pidamos mediante telegram

/* Código original de https: //github.com/gusman126/arduino_telegram_bot
  Modificado por wiki.intrusos.info
*/

#include <WiFiClientSecure.h>
#include <ESP8266WiFi.h>
#include "DHT.h"


// Definimos los parámetros de conexión a la WIFI
const char *ssid = "intrusos";   // no superior a 32 caracteres
const char *pass = "xxxxxxxxxx";   // contraseña wifi
int status = WL_IDLE_STATUS;

// Datos del Bot de Telegram
String BOTtoken = "bot2xxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";  //token Ojo hay que porner bot y seguido el token
String Chat_id = "xxxxxxxxx"; // Chat_id
String Texto_enviar = "";
String Texto_recibido = "";
String Update_id = "";
String anterior_upd = "";
String Nueva_upd = "";
String Respuesta = "";

// Variables del codigo de tiempo
int Inicio;
int Termino;
int Intervalo = 15000;
unsigned long elapsed = 0;
unsigned long previous;
boolean respondio = false;

// Pin del ESP8266 al que está conectado.
// El GPIO 4 corresponde al D2 del ESP8266-12E NodeMCU v3
#define DHTPIN 4

// tipo de sensor DHT
#define DHTTYPE DHT11   // DHT 11 

// Inicializa el sensor
DHT dht(DHTPIN, DHTTYPE);

WiFiClientSecure client; // inicio del cliente seguro
IPAddress server(149, 154, 167, 200); // IP de api.telegram.org


void setup() {

  Serial.begin(115200);

  // Conecta a la WIFI
  WiFi.begin(ssid, pass);
  /// }

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("Conectado a la red WiFi");
  Serial.println("Dirección IP: ");
  Serial.println(WiFi.localIP());

  // Comprobamos la conexion a Telegram
  if (client.connect(server, 443)) {
    Serial.println(".... conectado a Telegram");
  }
  // y enviamos el texto de inicio
  Enviar_texto(" Inicio del Sistema .......");

  // Comprobamos el ultimo mensaje
  Ultimo_msg();
  previous = millis();

}


void loop() {
  elapse();
  Leer_msg(); // leemos el ultimo mensaje

  // Comprobamos que haya pasado xx seg desde la ultima vez
  if (elapsed > 500) {

    anterior_upd = Update_id; // Guardamos la anterior Update
    Ultimo_msg (); // comprobamos el ultimo mensaje
    delay(1000); // Esperamos a recibir los datos
    Leer_msg(); // Leemos los datos
    busca_upd_id(Respuesta); // buscamos la Update_id y la guardamos
    busca_texto(Respuesta); // Buscamos el Texto del mensaje
    // Si ha cambiado la Update_id seguimos con el codigo
    if (anterior_upd != Nueva_upd) {
      //Serial.println("Es diferente Update");
      Responder_mensaje(Texto_recibido);
    } else {
    } // No hacemos nada si es el mismo Upd_id
  }
} // Fin Loop


// Orden para buscar el texto del mensaje
void busca_texto( String Rsp ) {
  Texto_recibido = "";
  int  start = Rsp.indexOf("text") + 7 ; // Buscamos el indice ( numero ) de la palabra "text" y le añadimos 7
  int  fin = Rsp.indexOf("}}]}") - 1; // Buscamos el indice del texto }}]} y le restamos uno
  Texto_recibido = (Rsp.substring(start, fin)); // Guardamos el resultado en la variable
}

//Orden para buscar la Update_id
void busca_upd_id( String Rsp ) {
  anterior_upd = Update_id; // Guardamos la anterior Update_id para comprobar
  int  start = Rsp.indexOf("update_id") + 11 ; // Buscamos el indice del texto y le añadimos 11
  int  fin = Rsp.indexOf("message") - 2; // Buscamos el indice del texto y le restamos 2
  Update_id = Rsp.substring(start, fin); // Guardamos la Update_id
  Nueva_upd = Rsp.substring(start, fin); // Volvemos a guardar la Update_id pero en la variable de nueva
}

// Orden para pedir el ultimo mensaje, vemos que se usa el Offset=-1&limit=1 para mostrar solo el ultimo
void Ultimo_msg () {
  if (client.connect(server, 443)) {
    // client.println("GET /botxxxx/getUpdates?offset=-1&limit=1");
    client.println("GET /" + BOTtoken + "/getUpdates?offset=-1&limit=1");
  }
  previous = millis(); // Guardamos los milisegundos para comprobar que haya pasado X tiempo entre lecturas
}

//Leemos el mensaje completo y lo añadimos a una variable caracter por caracter
void Leer_msg () {
  Respuesta = ""; // Vaciamos la variable
  while (client.available()) { // Mientras no lo lea todo seguira leyendo
    char inChar = client.read(); // Lee el caracter
    Respuesta += inChar; // Añadimos caracter a caracter el mensaje
  }
}

//Orden para comprobar el tiempo entre lecturas
void elapse() {
  elapsed = millis() - previous;
}


//Orden para enviar cualquier texto a Telegram
void Enviar_texto( String Texto_enviar ) {
  if (client.connect(server, 443)) {
    client.println("GET /" + BOTtoken + "/sendMessage?chat_id=" + Chat_id + "&text=" + Texto_enviar + "");
  }
}

//Aqui añadiremos las ordenes de respuesta del arduino
void Responder_mensaje ( String mensaje ) {

  if (mensaje == "Estado") {
    Enviar_texto("Conectado");
    respondio = true;
  }
  else if (mensaje == "Temperatura") {
    float t = dht.readTemperature(); // Obtiene la Temperatura en Celsius
    Enviar_texto(String(t) + "ºC");
    respondio = true;
  }
  else if (mensaje == "Humedad") {
    float h = dht.readHumidity(); // Obtiene la Humedad
    Enviar_texto(String(h) + "%");
    respondio = true;
  }

  if (respondio == true) { // mostramos el texto que se ha entendio
    Serial.println("El Texto : " + mensaje + " Lo he entendio perfectamente");
  }
  else {
    Serial.println("El Texto : " + mensaje + " No Lo he entendio");

  }
  respondio = false ; // Dejamos en falso que entendio el mensaje
}

////////// Fin del codigo

Referencias