{{tag>esp8266 arduino telegram nodemcu}} ===== 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**. * Escribimos **/newbot** y nos saldrá un mensaje preguntándonos el nombre que le vamos a poner a nuestro bot * Una vez escrito el nombre de nuestro bot y al pulsar enviar seguidamente nos preguntará un nombre de usuario. * Ponemos un nombre de usuario que debe de terminar con **bot** * Ahora nos saldrá un mensaje en el que nos dará una dirección y un token de acceso * Iniciamos un chat con nuestro bot * Si escribimos algo y enviamos el bot nos responde con lo mismo 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/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 {{:electronica:esp8266:nodemcudht11_bb.png?600|}} /* Código original de https: //github.com/gusman126/arduino_telegram_bot Modificado por wiki.intrusos.info */ #include #include #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 ==== * https://github.com/gusman126/arduino_telegram_bot * https://github.com/Lstt2005/ESP8266_I.O.Broker/tree/master/Arduino/Telegram/TelegramBot-master * https://github.com/CasaJasmina/TelegramBot-Library * https://create.arduino.cc/projecthub/Arduino_Genuino/telegram-bot-library-ced4d4 * http://trasteandoarduino.com/2016/03/21/telegram-contronlando-tu-servidor-hablandole-a-un-bot/ * http://www.xatakamovil.com/aplicaciones/llegan-los-bots-a-telegram-como-crear-el-tuyo-propio