Не связывается телеграм бот с Nodemcu (ESP8266)

Daminski

✩✩✩✩✩✩✩
26 Май 2021
23
1
Здравствуйте! Хочу сделать управление розетками в квартире через телеграм бота. На ютубе нашел много коротких, простых и интересных уроков на эту тему. Но завис на самой элементарной вещи - Телеграм бот совсем никак не коннектится с ESP, хотя в уроках всё получается с первого раза. Т.е. отправляя любые команды в телеграм бота, ESP на них никак не реагирует. Может кто-то сталкивался с подобной проблемой, как вы её решили?

Я пробовал и пересоздать бота, и сгенерировать заново токен бота, ничего не помогло. К Wi-Fi плата подключается нормально, вижу это в мониторе COM порта. Пробовал разные скетчи и короткие и длинные. Вставлю для примера вот этот:

C++:
// Умный выключатель на микроконтроллере ESP8266, тестировался на отладочной плате NodeMcu
// YouTube канал автора https://www.youtube.com/c/TryTech

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>

#define BOTtoken "2064499850:AAG5*********"  // Токен бота в формате xxxxx:xxxxxxxxxxxxxxx, начните беседу с ботом "BotFather" в Telegram и,
                                                                  // следуя инструкциям, создайте нового бота. Вам будет выдан секретный токен. Никому его не сообщайте.
char ssid[] = "Daminski";         // SSID (имя) вашей WiFi сети
char password[] = "D****";     // пароль wifi сети
String buttons[] = {"Lamp", "Socket"};  // имена подключенных устройств, с кириллицей НЕ РАБОТАЕТ!
int pin[] = {5, 4};                      // номер вывода, к которому подключено исполняющее устройство (реле, транзистор и т.д.)

bool protection = 1;                      // права доступа: 0 - доступно всем пользователям, 1 - доступ по Chat ID, если оно внесено в chatID_acces.
int chatID_acces[] = {}; // Chat ID, которым разрешен доступ, игнорируется, если protection = 0.
                                          // Примечание: по команде /start в Telegram, если у пользователя нет прав доступа на управление устройством, бот выдаст Chat ID
                                          // этого пользователя, чтобы его можно было внести в chatID_acces. Chat ID - это уникальный номер чата, который выдается
                                          // пользователю, начавшему общение с ботом.

String on_symbol="✅ ";  // Индикатор включенного состояния, можно заменить, например, на "Вкл."
String off_symbol="☑ "; // Индикатор выключенного состояния.

//Дальше ничего интересного, но если хотите, можете посмотреть.

WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
int quantity;
int Bot_mtbs = 3000;
long Bot_lasttime;  
bool Start = false;
const int ledPin = 2;
int ledStatus = 0;
String keyboardJson = "";

//int messageID;

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 m_id = String(bot.messages[i].message_id);
    if (bot.messages[i].type == "callback_query") {
      String statusMessage;
      for (int i1=0; i1<quantity; i1++) {
       if (bot.messages[i].text == buttons[i1]) {
       digitalWrite (pin[i1], !digitalRead(pin[i1]));
       }
      digitalRead(pin[i1])?statusMessage+=on_symbol:statusMessage+=off_symbol;
      statusMessage+=buttons[i1];
      statusMessage+='\n';
      }
      bot.deleteMessage(bot.messages[i].chat_id, bot.messages[i].message_id);
      bot.sendMessageWithInlineKeyboard(bot.messages[i].chat_id, statusMessage, "", keyboardJson);
     
    } else {
    String text = bot.messages[i].text;
    Serial.println(m_id);
    String from_name = bot.messages[i].from_name;
    if (from_name == "") from_name = "Guest";
    int i2=0;
    do{
    if (!protection || String(chatID_acces[i2]) == chat_id) {
      if (text == "/control") {
      String statusMessage;
      for (int i=0; i<quantity; i++) {
      digitalRead(pin[i])?statusMessage+=on_symbol:statusMessage+=off_symbol;
      statusMessage+=buttons[i];
      statusMessage+='\n';
      }
      bot.sendMessageWithInlineKeyboard(chat_id, statusMessage, "", keyboardJson);
      }

      if (text == "/start") {
      String welcome = "Приветствую " + from_name + ".\n";
      welcome += "Электрика в квартире.\n\n";
      welcome += "/control : Перейти к управлению.\n";
     // String keyboardStart = "[[{ \"text\" : \"YouTube канал автора\", \"url\" : \"https://www.youtube.com/c/TryTech\" }]]";
    //  bot.sendMessageWithInlineKeyboard(chat_id, welcome, "", keyboardStart);
      }
      break;
    }else{
      if (i2==((sizeof(chatID_acces)/sizeof(int))-1)&&text == "/start"||(sizeof(chatID_acces)/sizeof(int))==0&&text == "/start") {
      bot.sendMessage(chat_id, "No access, Chat ID: "+chat_id, "");
      }
    }

    i2++;
    }while (i2<(sizeof(chatID_acces)/sizeof(int)));
    }
  }
}

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

  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);

  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());

  quantity=sizeof(pin)/sizeof(int);
  for (int i=0; i<quantity; i++) {
  pinMode(pin[i], OUTPUT);
      }

  for (int i=0; i<quantity; i++) {
  if(i==0) keyboardJson += "[";
  keyboardJson += "[{ \"text\" : \"";
  keyboardJson += buttons[i];
  keyboardJson += "\", \"callback_data\" : \"";
  keyboardJson += buttons[i];
  keyboardJson += "\" }]";
  if(i==quantity-1){
    keyboardJson += "]";
    }else{
  keyboardJson += ",";
  }
  }
  delay(10);
  client.setInsecure();
}

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

    while(numNewMessages) {
      handleNewMessages(numNewMessages);
      numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    }
    Bot_lasttime = millis();
  }
}
 
  • Лойс +1
Реакции: kemosabers

Daminski

✩✩✩✩✩✩✩
26 Май 2021
23
1
Нашел ещё один, уже самый простой скетч, который должен просто отправить в телеграм бот одно сообщение. И он тоже не работает, в бот ничего не приходит. Помогите, пожалуйста разобраться.

Оставлю токен бота, может у вас получится к нему подключиться. И разумеется я ввожу своё имя Wi-Fi сети и пароль.

C++:
#include <ESP8266WiFi.h>
#include <UniversalTelegramBot.h>

#define WIFI_SSID "моя сеть WiFi"
#define WIFI_PASSWORD "мой пароль"

WiFiClientSecure secured_client;

#define BOT_TOKEN "2064499850:AAG52k-kuAvTvhkvFn6Kz-twRknZSOTEaoE"
#define CHAT_ID "467125185"

const unsigned long BOT_MTBS = 3000;
X509List cert; //(TELEGRAM_CERTIFICATE_ROOT);
UniversalTelegramBot bot(BOT_TOKEN, secured_client);
unsigned long bot_lastTime;

void setup() {
  Serial.begin(9600);
  configTime(0, 0, "pool.ntp.org");
  secured_client.setTrustAnchors(&cert);
  Serial.print("Connecting to WIFI ");
  Serial.print(WIFI_SSID);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
 
  while (WiFi.status() != WL_CONNECTED)
    {
      Serial.print(".");
      delay(300);
    }
  Serial.print("\nWiFi connected. IP address: ");
  Serial.println(WiFi.localIP());

  bot.sendMessage(CHAT_ID, "Online!", ""); //При включении в бот должно прийти это сообщение
  Serial.println("Online!"); //При включении показать надпись в мониторе порта

}

void loop() {
  // put your main code here, to run repeatedly:

}
 

nilbug

✩✩✩✩✩✩✩
18 Дек 2021
1
0
Как можно получать обновления?
На текущий момент доступно два способа. Вы можете использовать либо опрос, либо вебхуки. Обратите внимание: если вы используете вебхуки, метод getUpdates работать не будет.

Дело в вебхуках. Уберите их и все заработает.