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

Zabolotnyi

✩✩✩✩✩✩✩
18 Ноя 2024
5
1
@Att,
Пробовал только себе отправлять - то работает, то теряет сообщения (((
Вернул в скетч обработчик входящих сообщений и тикер в лупе, наблюдаю....
Пока 2 раза из двух сообщения отправлялись нормально обоим контактом.
 

AlexVoskres

✩✩✩✩✩✩✩
2 Дек 2024
1
0
Оформи код соответствующим тэгом, см. Правила
Нигде не нашёл примера, как правильно отправлять сообщения из других мест программы, кроме обработчика обновлений. Как я понял, надо использовать .isPolling() для асинхронной работы FastBot2. Правильно ли я сделал?:
while (1)
{
if (!telegram_bot.isPolling())
{
telegram_bot.sendMessage(fb::Message(menu_msg.c_str(), CHAT_ID));
break;
}
////////////////////////////////////////
telegram_bot.tick(); // тикаем в луп
///////////////////////////////////////////
vTaskDelay(5);
}
 

gidiara666

★✩✩✩✩✩✩
5 Май 2023
61
13
FastBot2:
#include <Arduino.h>

#define WIFI_SSID "PAS-3X3"
#define WIFI_PASS ""
#define BOT_TOKEN "здесь мой токенID"
#define CHAT_ID "ID1"  // здесь должны быть ID Telegram многих пользователей, но работает только если указать 1

#include <FastBot2.h>
FastBot2 bot;

void updateh(fb::Update& u) {
    if (u.isQuery()) { 
        // ответ на query
         bot.answerCallbackQuery(u.query().id());
       // реакция на query. Для удобства обработаем через хэш
        switch (u.query().data().hash()) {

            case "OutoopenON"_h:
            bot.answerCallbackQuery(u.query().id(), "Outoopen ответ"); // появляются в telegram, если нажать кнопку в инлайн меню
            bot.sendMessage(fb::Message("Outoopen включён", CHAT_ID)); // обычное сообщение
                break;

            case "OutoopenOFF"_h:
            bot.answerCallbackQuery(u.query().id(), "OutoopenOFF ответ");
            bot.sendMessage(fb::Message("Outoopen выключен", CHAT_ID));
                break;

            case "Ignore"_h:
            bot.answerCallbackQuery(u.query().id(), "answered Ignore");
            bot.sendMessage(fb::Message("Ignore", CHAT_ID));
                break;

            case "IgnoreOFF"_h:
            bot.answerCallbackQuery(u.query().id(), "answered IgnoreOFF");
            bot.sendMessage(fb::Message("IgnoreOFF", CHAT_ID));
                break;
        }
    }


    // сравнение в главном меню
if ( u.message().text() == "Open")
{
  bot.sendMessage(fb::Message("Дверь открыта", CHAT_ID)); // обычное сообщение
}


if ( u.message().text() == "Domofon")
{
    fb::Message msg("Domofon inline menu", CHAT_ID);
    fb::InlineMenu menu("OutoopenON ; OutoopenOFF ; Ignore ; IgnoreOFF, "OutoopenON;OutoopenOFF;Ignore;IgnoreOFF");
    msg.setInlineMenu(menu);
    bot.sendMessage(msg);
}

}


void setup() {
    Serial.begin(115200);
    Serial.println();

    WiFi.begin(WIFI_SSID, WIFI_PASS);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("Connected");
    // attach
    // ============
    bot.attachUpdate(updateh);   // подключить обработчик обновлений
    bot.setToken(F(BOT_TOKEN));  // установить токен

    bot.setPollMode(fb::Poll::Long, 20000);


//////////////
fb::Message msg("Show menu", CHAT_ID);  // появляется меню в самом начале
fb::Menu menu("Open; Domofon;\n Sequrity; Switches; Temperature;\n Other; HUB; Info");
msg.setMenu(menu);  // подключить меню
bot.sendMessage(msg);
/////////////

}

void loop() {
    // вызывать тикер в loop
    bot.tick();
}
// Проблема в следующем: ежели в FastBot можно было указать CHAT_ID - и меню приходило всем участникам, либо
bot.sendMessage(mes2, msg.chatID); - и сообщение приходило именно тому, кто нажал кнопку в меню:

else if (msg.text == "Sequrity")
{
bot.showMenu(" SequrityOn \t SequrityOFF \n Menu");
String mes2;
if (securityF) {mes2 += "Состояние: охрана включена ✅\n\n";}
else {mes2 += "Состояние: охрана снята ❗\n\n";}
bot.sendMessage(mes2, msg.chatID);
}

то в FastBot2 указание нескольких ID делает код неработоспособным! Т.е. если указать: #define CHAT_ID "ID1,ID2,ID3" - работоспособность кода приведённого выше теряется.
Как же сделать много участников и как высылать ответ именно тому, кто инициировал кнопку в меню Telegram?
 
Изменено:

zhogar

✩✩✩✩✩✩✩
24 Дек 2024
1
0
Здравствуйте, вопрос..

Кто собирал проект FastBot под китайскую Arduino Uno, и Ethernet Shield?

Не выходит собрать проект, постоянно пишет ошибку:

"
In file included from C:\Users\user\Desktop\Вася\Проекты\ArduinoTelemetry\ArduinoTelemetry.ino:28:0:
c:\Users\user\Documents\Arduino\libraries\FastBot\src/FastBot.h:133:10: fatal error: StreamString.h: No such file or directory
#include <StreamString.h>
^~~~~~~~~~~~~~~~
compilation terminated.
exit status 1

Compilation error: exit status 1

"
 
Изменено:

gidiara666

★✩✩✩✩✩✩
5 Май 2023
61
13
Вчера выдался у меня выходной, разобрался в некоторых функциях FastBot2.
В приведённом примере показано как:
1. Использовать несколько TelegramID
2. Заносить в память ESP и юзать далее TelegramID и BotID.
3. Использование Инлайн меню с откликами об исполнении команд, с постоянным неизменным основным меню.
4. Отправка сообщений "По факту изменения состояния порта контроллера", рассылка - всем указанным в telegramID списке
5. Вывод информации в Telegram индивидуально, по запросу для Id, с которого пришёл запрос.
Пока не понял, как сделать запрет на исполнение команд, которые были введены до старта контроллера, механизм заклинаний сильно отличается от первой версии, у кого получилось - не стесняйтесь со своими примерами.
Нашёл баг: все инлайн меню необходимо делать при помощи Builder, при написании inline menu "вручную" (вся терминология - создателя FastBot2) - глюки либо ложные срабатывания при нажатии на 3-ю и далее кнопки, расположенных по 2 в ряд, с множественными столбцами, если их только две - работают отлично.
PS. В коде отсутствует фильтрация по ID и каждый может подавать команды на выполнение. Это легко исправляется при помощи парсинга ID после каждого сообщения в бот и соответствующую реакцию логики кода на разные ID
 

Вложения

Изменено:

Att

✩✩✩✩✩✩✩
14 Фев 2024
16
2
@gidiara666,
После подключения к wifi, до первого тика бота вызвать
bot.skipUpdates(-1)
bot.setOnline(1)
Отслеживать Wifi. Если нет подключения, то
bot.setOnline(0)