FastBot. Обсуждение библиотеки

Старик Похабыч

★★★★★★★
14 Авг 2019
4,220
1,291
Москва
Я так понял esp стоит типа esp-01 и используется ее стандартная прошивка, которая штатная ?
Прошивка FastBot сделана для перепрошивки esp, т.е. заменяет штатную прошивку. Тут вариант искать другую библиотеку, которая умеет работать с такой прошивкой.
 

Homo Faber

✩✩✩✩✩✩✩
9 Мар 2022
15
0
@vortigont, Так он с Blynk мутит. Это, к сожалению, пройденный этап. С этой системой мой проект отработал почти год, никаких проблем не было: сообщения, управление, обратная связь - всё великолепно. Но в связи с известными событиями, Blynk в России накрылся. Приходится изворачиваться. Пробовал RemoteXY, сейчас подобрался к Virtuino, но пока результат не удовлетворяет, по сравнению с Blynk...
 

vortigont

★★★★★★✩
24 Апр 2020
1,018
532
Saint-Petersburg, Russia
@Homo Faber, ну так бы и назвали тему - "альтернатива Blynk для Atmega платформы". И рассказали бы толком схему своего проекта типа ссылки что я выше кидал. Может кто и подсказал бы что, а то фастбот, атмега, push, ненайденные библиотеки, какой-то поток сознания и боли... Такое ощущение что люди разучились внятно доносить свои мысли.
 

Homo Faber

✩✩✩✩✩✩✩
9 Мар 2022
15
0
@Homo Faber,Такое ощущение что люди разучились внятно доносить свои мысли.
Таки дав, Вы правы. Разучились мы внятно выражать свои мысли... :( Но вы верно расшифровали поток моего сознания. Правда, хотелось бы ещё и какой ни будь подсказки в направлении...
 

vortigont

★★★★★★✩
24 Апр 2020
1,018
532
Saint-Petersburg, Russia
@Homo Faber, не знаю. Вы хотите связь через сеть с платой которая на это неспособна (Мега). Вам нужна какая-то платформа, которая имеет связующий компонент через блютус/сериал-порт или еще что-то и реализованный протокол обмена данными. Это сильно сужает ваш поиск если вы не готовы писать эти связки сам. Я бы все таки смотрел в сторону переезда на контроллеры с поддержкой выхода в сеть. Готовых решений под них банально больше из чего выбирать.
 

Sepro

✩✩✩✩✩✩✩
20 Май 2020
1
0
Товарищи, которые вплотную работают с библиотекой, подскажите пожалуйста пару моментов.
1) заливаю пример с обычным меню в есп 8266, при подаче питания в чат приходит сообщение "Open Menu". Как этого избежать?
2) Все в том же примере с обычным меню, нажав на кнопку закрытия меню оно больше не открывается. Как обратно вызвать его? С разных телефонов и устройств
 

gem.ini

✩✩✩✩✩✩✩
28 Сен 2021
12
1
Привет! Использую FastBot на ESP8266. ESP8266 выполняет некоторую локальную работу в цикле LOOP, и через FastBot управляется через Telegram. Все отлично работает, пока не пропадет выход интернет (именно связь ISP/WAN, а не сеть WiFi). После чего цикл LOOP виснет, и как следствие все, что должно выполняться независимо от наличия интернета в цикле LOOP, останавливается. А не должно. Подвисает строка 251 в библиотеке FastBot.h

C++:
if (!_http->begin(client, req)) return 4;
Я понимаю, что это не проблема библиотеки, и все же хочу спросить, кто то знает, как это обойти? Надо, чтобы LOOP крутился, даже если нет доступа к серверу api.telegram.org?
 

gidiara666

★✩✩✩✩✩✩
5 Май 2023
59
13
Проблема в Вашем коде. Использую Fastbot для работы с Telegram одновременно с GP. Тестировал неоднократно пропадание связи, все прекрасно продолжает функционировать локально. Скорей всего, обычная проверка сети ведёт в вашем коде к бесконечной рекурсии до восстановления связи. Ну реально, причем здесь портал, Fastbot к затыку в работе Loop??
Смотрите свой код, все тестировалось неоднократно. Тем более, испрльзуете код Гайвера, а это- гарантия качества.
 

gem.ini

✩✩✩✩✩✩✩
28 Сен 2021
12
1
@gidiara666,

Спасибо за ответ! Только я не просто так указал место, где подвисает исполнение кода, если пропадает связь с WAN/ISP. А именно вызов конструктора http.begin(client, URL) внутри FastBot.h. Что касается моего кода - если убрать только одну строку bot.tick(); то никаких проблем при пропадании связи с интернетом или WiFi в исполнении остального в LOOP нет. Ниже скелет кода, который я использую:

C++:
#include <FastBot.h>

#define ssid "MySSID"
#define password "passwrd"
#define BOT_TOKEN "token"  // Токен бота...
#define CHAT_ID "chatid"


FastBot bot(BOT_TOKEN);

void setup() {
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(200);
    if (millis() > 20000) ESP.restart();
  }

  bot.setChatID(CHAT_ID);
  bot.attach(newMsg);


  // индикатор активности цикла LOOP
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);
}

void loop() {

// мигалка встроенным светодиодом, индикатор активности LOOP
  static bool led_state = true;
  static uint32_t timer_ = millis();
  if (millis() - timer_ > 1000) {
    digitalWrite(2, led_state = !led_state);
    timer_ = millis();
  }

  // в этом месте подвисает, когда связи с api.telegram.org нет (или обрыв WiFi)
  // если строку bot.tick(); закомментировать, то при обрыве связи все ОК
  bot.tick();

  if (Serial.available()) {
  // работа с интерфейсом UART
  }

  // еще кусок кода, который должен исполняться независимо от наличия интернета и WiFi-соединения
}

void newMsg(FB_msg& msg) {
  // обработка сообщений из чата
}
Не поленился, еще раз протестировал именно приведенный кусок кода (подставив правильные значения SSID token и все остальное), тело loop только с мигалкой и тиком. Все. Залил в ESP8266, запустил. Светодиод мигает. Отключаю WAN на роутере - мигание остановилось. Так что с моим кодом все хорошо. Вопрос открытый.
 
Изменено:

gem.ini

✩✩✩✩✩✩✩
28 Сен 2021
12
1
@gidiara666, задание токена перенес в Setup, хотя связи с проблемой не вижу, все равно попробовал. Ничего не поменялось. Включил дебаг, и вот что он показал:
C++:
21:02:26.084 -> [HTTP-Client][sendRequest] type: 'GET' redirCount: 0
21:02:26.084 -> [hostByName] request IP for: api.telegram.org
21:02:26.084 -> [hostByName] Host: api.telegram.org IP: 10.0.0.1
21:02:26.084 -> :ref 1
21:02:41.097 -> :ctmo
21:02:41.097 -> :abort
21:02:41.097 -> :ur 1
21:02:41.097 -> :dsrcv 0
21:02:41.097 -> :del
21:02:41.097 -> BSSL:connect: Unable to connect TCP socket
21:02:41.097 -> [HTTP-Client] failed connect to api.telegram.org:443
21:02:41.097 -> [HTTP-Client][returnError] error(-1): connection failed
21:02:41.097 -> [HTTP-Client][end] tcp is closed
Если я понимаю правильно, то затык в WiFi роутере, DNS становится недоступен, IP адрес теряется, и он не важен - связи все равно нет. Ответ о недоступности сервера идет от роутера, и это та самая пауза для LOOP. По крайней мере примерно стало понятно, из-за чего глюк. Придется обходить его в скетче. С библиотекой все четко. Спасибо.
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,220
1,291
Москва
У есп есть какая то проблема в потере сигнала WiFi, если на короткое время, то он восстанавливается, а если долго, то стандартная WiFi встает раком и восстанавливать связь не хочет. При этом статус соединения получает номер 4 WiFi.status() == 4 . Я делал такую проверку:
C++:
    if (WiFi.status() == 4)
    {
      WiFi.disconnect();
      delay(10);
      WiFi.mode(WIFI_STA);
      WiFi.begin(wifi_cfg.ssid, wifi_cfg.pass);
    }
До этого тупо рестартил esp, что было не очень хорошо. Такой вариант вполне работает.
 
  • Лойс +1
Реакции: gidiara666

gem.ini

✩✩✩✩✩✩✩
28 Сен 2021
12
1
@Старик Похабыч, в моем случае если отключить WiFi физически, то подвиcание происходит единожды примерно на 5 секунд и дальше никаких проблем - loop крутится даже с открытым методом bot.tick(), без сети. С сетью WiFi и без доступа в сеть интернет (конкретно, к телеграм серверу) как раз сложность. Проверял скетч на ESP32, такая же история с небольшой разницей - ESP32 периодически "отвисает" на 3 секунды примерно (насколько понимаю, это интервал проверки tick() 3600 мс), при попытке доступа к серверу снова стоп на секунд 15-20, далее 3 сек работы и снова пауза. Дело в том, что у меня через бота на ESP8266 по UART идет общение с другим девайсом на Atmega328p. Девайс автономный, и доступ к сети нужен только для его контроля и мониторинга (не критичный сервис). Если ESP8266 через UART перестает отвечать, девайс к нему уже не стучится, понимая что связь по UART пропала. Зависание ESP8266 из-за проблем со связью со стороны WAN приводят к тому, что ESP не отвечает и по рабочему UART'у из-за того, что его обработчик в loop висит. В целом все это некритично в данном случае, пока оставил так. Но в будущих проектах, где исполнителем будет собственно ESP это поведение буду учитывать изначально.
 

astrosander

✩✩✩✩✩✩✩
29 Июн 2023
2
0
Как в библиотеке fastbot можно при получении сообщения void newMsg(FB_msg& msg) можно проверить, что это сообщение текст, а не стикер, картинка, видео и т.д.
 

Vlad_M

✩✩✩✩✩✩✩
5 Ноя 2023
2
0
Приветствую, решил сделать простого бота отправляющего температуры в Телеграм, но стакнулся с проблемой, что библиотека толи не поддерживает float либо я сделал неправильно, подскажите как данные перевести в формат который поддерживает библиотека.


Код скетча:
void Print(){
   bot.setChatID("***");

    // Read the humidity from the sensor.
    float humidity = dht11.readHumidity();

    // Read the temperature from the sensor.
    float temperature = dht11.readTemperature();

  if (temperature != -1){
    Serial.print("Температура ");
    Serial.print(temperature);
    Serial.println("C");
      bot.sendMessage("Температура");
        bot.sendMessage(dht11.readTemperature);
  }
  else{
    Serial.println("Ошибка чтения температуры");
      bot.sendMessage("Ошибка чтения температуры");
  }

  if (humidity != -1){
    Serial.print("Влажность ");
    Serial.print(humidity);
    Serial.println("%");
      bot.sendMessage("Влажность");
        bot.sendMessage(dht11.readHumidity);
  }
  else{
    Serial.println("Ошибка чтения влажности");
      bot.sendMessage("Ошибка чтения влажности");
  }
Код ошибки:
C:\Users\vmark\OneDrive\Documents\Arduino\sketch_oct30a\sketch_oct30a.ino: In function 'void Print()':
C:\Users\vmark\OneDrive\Documents\Arduino\sketch_oct30a\sketch_oct30a.ino:77:31: error: invalid use of non-static member function 'float DHT11::readTemperature()'
   77 |         bot.sendMessage(dht11.readTemperature);
      |                         [CODE]~~~^~~~~~~~~~~~~~~
In file included from C:\Users\vmark\OneDrive\Documents\Arduino\sketch_oct30a\sketch_oct30a.ino:1:
c:\Users\vmark\OneDrive\Documents\Arduino\libraries\DHT11\src/DHT11.h:17:9: note: declared here
   17 |   float readTemperature();
      |         ^~~~~~~~~~~~
C:\Users\vmark\OneDrive\Documents\Arduino\sketch_oct30a\sketch_oct30a.ino:89:31: error: invalid use of non-static member function 'float DHT11::readHumidity()'
89 | bot.sendMessage(dht11.readHumidity);
|
Код:
~~~^~~~~~~~~~~~
In file included from C:\Users\vmark\OneDrive\Documents\Arduino\sketch_oct30a\sketch_oct30a.ino:1:
c:\Users\vmark\OneDrive\Documents\Arduino\libraries\DHT11\src/DHT11.h:14:9: note: declared here
   14 |   float readHumidity();
      |         ^~~~~~~~~
exit status 1

Compilation error: invalid use of non-static member function 'float DHT11::readTemperature()'[/CODE]
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
bot.sendMessage(to_string(dht11.readTemperature()));

или

float x=dht11.readTemperature();
std::stringstream st;
st<<x;
bot.sendMessage(st.str());
 
Изменено:

gem.ini

✩✩✩✩✩✩✩
28 Сен 2021
12
1
@astrosander, а флаг isFile разве не признак того, что сообщение это файл, а не текст?

Вот часть описания структуры FB_msg из документации к библиотеке:

Внутри этой функции можно пользоваться переданной переменной сообщение, которая имеет тип FB_msg (структура) и содержит в себе:
String userID - ID пользователя
String username - имя пользователя или канала
bool isBot - сообщение от бота
String chatID - ID чата
int32_t messageID - ID сообщения в чате
bool edited - сообщение отредактировано
String text - текст сообщения или попдпись к файлу
String replyText - текст ответа, если он есть
String data - callback данные из меню (если есть)
bool query - запрос
bool isFile - это файл
String fileName - имя файла
String fileUrl - адрес файла для загрузки
bool OTA - запрос на OTA обновление (получен .bin файл)
uint32_t unix - время сообщения
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
@bort707,
C++:
uint8_t sendMessage(String msg);
uint8_t sendMessage(String msg, String id);
библиотека не поддерживает тип с плавающей точкой
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
@poty, я выше уже привел 2 примера. Насчет 2 конечно точно не знаю, поймет ли компилятор ардуино иде. А так предельно говорите
 
  • Лойс +1
Реакции: poty

cyberman

✩✩✩✩✩✩✩
27 Июн 2023
4
0
Уважаемые коллеги, помогите плиз в таком вопросе.
У Алекса есть прекрасная библиотека FastBot - сделал с ее помощью бота на ESP32, сижу и радуюсь на него. Но есть задача: передавать данные не между ESP32 и чатом бота на платформе ТГ, а между двумя ESP. Кратко: на первой ESP-шке нажимаю кнопку, от нее в ТГ уходит команда - на второй ESP-шке должен включиться/ выключиться светодиод, о чем в первую ESP-шку уходит квитанция, которая выводится в Serial-порт. Все это через Телеграм, наверное через бота (а может он здесь вообще не нужен..? тогда как...?). Если я РУКАМИ в чате бота на платформе ТГ (в web-версии или в приложении) пишу нужную команду для второй ESP-шки или квитанцию для первой - то они их прекрасно ловят и как надо отрабатывают. Но если первая ESP-шка САМА отправляет в чат бота команду, то вторая ее в упор не видит. Равно как и наоборот: если вторая ESP-шка сама отправляет квитанцию для первой: первая ее не видит. Хотя в чате бота и команды и квитанции благополучно отображаются. Что я делаю не так и как решить такую задачу?
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,927
619
44
Два бота между друг другом не могут обмениваться сообщениями в телеге, это ограничение самой телеги. Ищите другие способы.
 

cyberman

✩✩✩✩✩✩✩
27 Июн 2023
4
0
@Геннадий П, я понимаю что два бота друг с другом не могут обмениваться сообщениями. Но может можно как-то все-таки сделать передачу сообщений между двумя приложениями (контроллерами) через ТГ ? Хотя бы в принципе понять - как это сделать. А какую сторону копать...?