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

DoNtUo

✩✩✩✩✩✩✩
10 Апр 2022
2
0
как сохранить сообщение, которое приходит через пользователя в переменную char?
Кстати, "мой код":
bot_telegram:
#define WIFI_SSID ""
[CODE lang="cpp" highlight="43"]#define WIFI_SSID ""
#define WIFI_PASS ""
#define BOT_TOKEN ""


#include <GParser.h>
#include <FastBot.h>
FastBot bot(BOT_TOKEN);

void setup() {
  connectWiFi();

  bot.attach(newMsg);
}

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

}

void connectWiFi() {
  delay(2000);
  Serial.begin(115200);
  Serial.println();

  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    if (millis() > 15000) ESP.restart();
  }
  Serial.println("Connected");
}

void newMsg(FB_msg& msg) {
  // выводим ID чата, имя юзера и текст сообщения
  Serial.print(msg.chatID);     // ID чата
  Serial.print(", ");
  Serial.print(msg.username);   // логин
  Serial.print(", ");
  Serial.println(msg.text);     // текст
  const char* message[30];
  message = msg.text;
  Serial.println("char is:");
  Serial.println(message);

 
  bot.sendMessage(msg.text, msg.chatID); 
}
вот ошибка:
exit status 1
array must be initialized with a brace-enclosed initializer
 

leon013

✩✩✩✩✩✩✩
14 Апр 2022
5
2
Напрямую строчную переменную не перевести в массив, да еще в константу )) Можно вот так:
unsigned char message[30];
unsigned char y;
String message_str;
y = message_str.length();
message_str.getBytes(message, y);

это для примера ...
 

DoNtUo

✩✩✩✩✩✩✩
10 Апр 2022
2
0
@leon013,а если мне нужно данные, который прислал пользователь с телеграма и разбить эти данные на 3 части (например: /set 0, 2 )
 

leon013

✩✩✩✩✩✩✩
14 Апр 2022
5
2
@DoNtUo, тогда нужно строго задать "рамки" этого сообщения. Последовательность данных и их "строгое" задание. Что бы потом найти их или по месту в пришедшей переменной или по каким либо символам в этой переменной.
немного об это можно почитать тут - https://arduinoprosto.ru/q/21846/kak-preobrazovat-stroku-v-massiv-baytov
 

Boroda22

★✩✩✩✩✩✩
23 Фев 2022
251
42
Последовательность данных и их "строгое" задание. Что бы потом найти их или по месту в пришедшей переменной или по каким либо символам в этой переменной.
Чтобы такой ерундой не заниматься, нужно данные слать в JSON-формате (отправлять/читать) будет на порядок проще, и не будет геморроя с парсингом.
 

leon013

✩✩✩✩✩✩✩
14 Апр 2022
5
2
Избыточное цитирование. Отредактируй или сообщение будет удалено
Чтобы такой ерундой не заниматься, нужно данные слать в JSON-формате (отправлять/читать) будет на порядок проще, и не будет геморроя с парсингом.
не сочтите за труд поделиться кодом такого решения. Вводные данные :бот управляет двумя термостатами с отдельными реле. нужно задать температуру включения нагревателя первого термостата. Что должен ввести в чате среднестатистический юзер для достижения такого результата. И что бы защита от неправильного ввода тоже была. в свете вашего предложения конечно.
мне самому интересно для дальнейшего применения такое решение
 
  • Лойс +1
Реакции: gidiara666

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

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
Я тут попробовал эту библиотеку.
В принципе если скорость ответа не сильно критичная, то вполне можно парсить саму строку - у String достаточно функций для этого
 

Boroda22

★✩✩✩✩✩✩
23 Фев 2022
251
42
Что должен ввести в чате среднестатистический юзер для достижения такого результата.
Перед отправкой сообщения, нужно упаковать служебную информацию в json-объект, и отправить как есть, текстом, но в формате json. А уже на принимающей стороне прочитать это сообщение и преобразовать в объект. К сожалению продемонстрировать не могу, пишу с телефона, в сети предостаточно инфы как работать с json на ардуинке.

И что бы защита от неправильного ввода тоже была.
валидируйте сообщение перед отправкой, т. е. после того как бот получил сообщение от юзера, но перед отправкой на ардуино.

на коленке, по памяти:
{
"termName": "term1",
"termValue": value
}
это простейший пример. все, что вам нужно, это создать json-объект, и работать как с объектом
 

leon013

✩✩✩✩✩✩✩
14 Апр 2022
5
2
{
"termName": "term1",
"termValue": value
}
это простейший пример. все, что вам нужно, это создать json-объект, и работать как с объектом
мне кажется мы немного не понимаем друг друга... Вопрос в том кто или что будет формировать этот json-объект со стороны юзера. Если у него перед глазами смартфон с запущенным приложением телеграмм и клавиатура открытого чата с ботом. Каким образом в чате с ботом можно сформировать и указать, что сейчас будет отправлен боту json-объект???
я сделал бы у себя такую команду так /tn1onXX.X
 

Boroda22

★✩✩✩✩✩✩
23 Фев 2022
251
42
@leon013,ну так и нужно было писать, что вы не разработчик чат-бота, и повлиять на его работу не можете. тогда остается костылить в виде добавления служебных символов для разделения команд на датаграммы, например, как вы и сделали. либо еще проще: #tn1=xx.x
 

_Quasar_

✩✩✩✩✩✩✩
30 Июл 2021
52
0
Есть у кого больше примеров в раскрытии потенциала этой библиотеки. Так как на гетхабе конечно написана инструкция, но у меня не так много знаний, чтобы все это реализовывать. Еще читал примеры на https://kit.alexgyver.ru/tutorials/fastbot/, но там очень мало и продолжения похоже не намечается. Хотелось бы научиться оформлять меню в боте или что-то подобное.
 

_Quasar_

✩✩✩✩✩✩✩
30 Июл 2021
52
0
Подскажите.. Вот кусок кода, хочу вывести значения температуры ds18b20 в телеграмм, ругается на тип float.
 

Вложения

_Quasar_

✩✩✩✩✩✩✩
30 Июл 2021
52
0
замените temperatureC на String(temperatureC)
Проверку кода и заливку проходит, но работать физически отказывается.
Я пишу /temp он говорит читаю, и все молчком. Может я конструкцию не правильно поставил. Заливаю этот "модифицированный код" без бота с выводом параметров в сериал все работает.

C++:
#define WIFI_SSID "***"
#define WIFI_PASS "***"
#define BOT_TOKEN "***"
#define ChatID "***"


#include <FastBot.h>

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 5

OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensor(&oneWire);

FastBot bot(BOT_TOKEN);
void setup() {
  sensor.begin();
  sensor.setResolution(9);

  connectWiFi();
  bot.attach(newMsg);
  bot.setChatID(ChatID);
  bot.sendMessage("Соединился v 1.3.1");

}



// обработчик сообщений
void newMsg(FB_msg& msg) {
String temperature;





  if (msg.text == "/temp" && msg.chatID == ChatID ){

    bot.sendMessage("читаю");
    sensor.requestTemperatures();
    temperature = sensor.getTempCByIndex(0);
    bot.sendMessage(temperature);
    delay(800);
  }

  if (msg.OTA && msg.chatID == ChatID) bot.update();

}


void loop() {
  bot.tick();
}
void connectWiFi() {
  delay(2000);
  Serial.begin(115200);
  Serial.println();
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    if (millis() > 15000) ESP.restart();
  }
  Serial.println("Соединился с "  WIFI_SSID);

}
 
Изменено:

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

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
Я писал сделать совсем не так.
1) getTempCByIndex возвращает значение типа float
2) bot.sendMessage отправляет данные типа String
3) Получив температуру 1-ой функцией ее надо преобразовать в тип String так как я показала выше и уж потом отправлять.
 
  • Лойс +1
Реакции: _Quasar_

_Quasar_

✩✩✩✩✩✩✩
30 Июл 2021
52
0
@Старик Похабыч,
Вот через такую конструкцию заработало.. Конечно может есть способ проще... Но спасибо за наводку
C++:
void newMsg(FB_msg& msg) {
float temperature;
String myStringe = "";
 
  if (msg.text == "/temp" && msg.chatID == ChatID ){
 
    bot.sendMessage("читаю");
    sensor.requestTemperatures();
    temperature = sensor.getTempCByIndex(0);

    
    myStringe.concat(temperature);
    
    bot.sendMessage(myStringe);
    delay(800);
  }
 

MartyArty

✩✩✩✩✩✩✩
22 Июл 2022
2
1
Добрый день, подскажите, может кто сталкивался с проблемой:
Когда задан один CHAT_ID, то все сообщения приходят без пропуска.
Если задать 2 CHAT_ID (#define CHAT_ID "111111111,222222222") bot.setChatID(CHAT_ID); то на первый ID (111111111) в списке периодически сообщения не отправляются.
Соответственно и в функции bot.sendMessage("text", "111111111,222222222"); если задать chat явно, такая же ситуация.

Т.е. на один ID приходят все сообщения, на другой около половины теряется. Отладить на месте пока возможности нет, ESPшка стоит удаленно.
Если задать много CHAT_ID каким образом библиотека отправляет сообщения? через паузу чтобы обойти ограничения бота? может в этом проблема?
 
  • Лойс +1
Реакции: pingemall

pingemall

✩✩✩✩✩✩✩
22 Мар 2020
25
0
Родина
www.mj2cnc.kh.ua
Всем привет.
Подскажите если кто ведает. Можно ли менять (подставлять) значение токена "на лету", после того как я вытащу его из памяти, введу в настройках или каким либо способом закину в esp, а не при компиляции?
На подобии ssid и pass для установки связи с wifi.

#include <FastBot.h>
.
.
void setup(){
FastBot bot(BOT_TOKEN.c_str());
.
}

Спасибо.
 
Изменено:

Matadon

✩✩✩✩✩✩✩
6 Окт 2019
25
0
Доброго времени суток, форумчане!
Господа, есть задачка не тривиально использовать библиотеку FastBot, а вместе с ней Blynk и TinyGsm (для GSM модуля)
Код написал, ошибок нет, прошивается, в мониторе порта ответы есть, но телеграм бот молчит
Подозреваю, что сама библиотека пытается "выйти в интернет" через WiFi, который на борту самого NodeMCU, а не через GSM модуль, в чём собственно и загвоздка
Есть ли готовый способ или какие-нибудь идеи, как это сделать?

C++:
#define TINY_GSM_MODEM_SIM800
#define RX D7
#define TX D4
#define BLYNK_PRINT Serial

#include <Arduino.h>
#include <BlynkSimpleTinyGSM.h>
#include <TinyGsm.h>
#include <SoftwareSerial.h>
#include <FastBot.h>

const char apn[] = "internet";
const char user[] = "";
const char pass[] = "";
const char srv[] = "192.168.0.2";
const char auth[] = "**********************";
const char token[] = "***************************";
const uint16_t port = 8080;
static String lat, lon;

SoftwareSerial SerialAT(RX, TX);
TinyGsm modem(SerialAT);

FastBot bot(token);

void newMsg(FB_msg& msg) {
  if (msg.text == "On") {
    digitalWrite(D5, HIGH);
    bot.sendMessage("Done", msg.chatID);
  }
  else if (msg.text == "Off") {
    digitalWrite(D5, LOW);
    bot.sendMessage("Done", msg.chatID);
  }
}

void setup() {
  pinMode(D5, OUTPUT);
  Serial.begin(9600);
  SerialAT.begin(9600);
  Serial.println("Initializing modem...");
  modem.restart();
  String modemInfo = modem.getModemInfo();
  Serial.println("Modem info: " + modemInfo);
  Serial.print("Connecting to internet... ");
  Blynk.begin(auth, modem, apn, user, pass, srv, port);
  delay(6000);
  Serial.println("Done");
  bot.setChatID("**********");
  bot.attach(newMsg);
  Serial.println("Attached");
  bot.sendMessage("Hi, I'm online", "**********");
  Serial.println("Message sent");
}

void loop() {
  bot.tick();
  static uint32_t myTimer;
  if (millis() - myTimer > 5000) {
    myTimer = millis();
    String str = modem.getGsmLocation();
    lon = str.substring(0, str.indexOf(","));
    lat = str.substring(str.indexOf(",") + 1, str.length() - 4);
    Blynk.virtualWrite(V0, 1, lat, lon, "Tracker");
    Blynk.virtualWrite(V1, float(modem.getBattVoltage()) / 1000);
    Blynk.virtualWrite(V2, modem.getBattPercent());
    Blynk.virtualWrite(V3, modem.getOperator());
    Blynk.virtualWrite(V4, modem.getSignalQuality());
  }
  Blynk.run();
}
P.S.
Когда подключаю NodeMCU к своему WiFi, то всё работает
Задача подружить библиотеку FastBot с TinyGsm
 
Изменено:

MKontrol

✩✩✩✩✩✩✩
13 Ноя 2022
1
0
Всем привет!
При прошивке стандартного примера OTA_update из библиотеки FastBot в чат выдается:
Mouse8266: OTA firmware...
Mouse8266: Error
В отладочной печати :
19:18:01.227 -> .......Connected
19:18:04.958 -> v1.0
19:19:23.776 -> userID: 128xxx5561, username: МК, isBot: 0
19:19:23.776 -> chatID: 128xxx5561, messageID: 137, edited: 0
19:19:23.776 -> text: , replyText:
19:19:23.776 -> query: 0, data:
19:19:23.776 -> isFile: 1, fileName: Test_OTA_update.ino.d1.bin, OTA: 1
19:19:23.776 -> fileUrl: https://api.telegram.org/file/bot56668788[........]FQ/documents/file_7.bin
19:19:23.816 -> unix: 1668356359
19:19:23.816 ->

Это только у меня этот пример не работает? Что нужно проверить/сделать чтобы залился скетч по OTA?
Спасибо!

Коллеги, есть у кого-нибудь три минуты времени чтобы проверить работу этого примера на своей ESPшке?
ОТА апдейты из любой другой библиотеки работают нормально. В чем дело может быть здесь?

Пробовал зажать в gzip, картина не поменялась, опять Error.
Что еще попробовать?

На всякий случай обновил библиотеку ESP8266httpUpdate.h . Не помогло...

Как раз сегодня получил пару LOLIN ESP32 S2 mini. Залил этот пример в нее и все заработало!
Я конечно могу перейти на новую плату, но уж очень хотелось бы разобраться, почему не хочет работать 8266?
 

anton_43

✩✩✩✩✩✩✩
23 Ноя 2022
4
3
Добрый день. Где можно посмотреть пример кода меню? Задача - после /start выдавать меню на запрос переменной (задать температуру) и отображение текущих настроек. После выбора "Задать Т" соответственно ввод числа и запись в переменную
 
  • Лойс +1
Реакции: AlexRoss

igorbob

✩✩✩✩✩✩✩
9 Дек 2022
1
0
Всем привет!
При прошивке стандартного примера OTA_update из библиотеки FastBot в чат выдается:
Mouse8266: OTA firmware...
Mouse8266: Error
Такая же фигня esp 01 4mb

Что может быть не так?

Проблема с обновлением OTA только у модуля esp-01 на других платах проблем нет...
 
Изменено:

Avtozapusk

✩✩✩✩✩✩✩
26 Дек 2022
2
0
@igorbob,

Скорее всего сообщение Error связано с размером файла. Например:если я закидываю в чат файл размером 467 кб то выдается сообщение

OTA firmware...

Error

а если я уже закину в чат файл с размером 403 кБ то все Ок .
OTA firmware...

OK

Моя плата ESP-01 настройки LittleFS "1 MB (FS:64KB OTA:~470KB)"

Пока что не разобрался где размеры свободной памяти под этот файл обновления сверять