meta data de esta página
  •  

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<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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
/* 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