Community Engee

Telegram API

Author
avatar-alexevsalexevs
Notebook

Отправка сообщений в Telegram из Engee

В этом примере рассматриваются способы применения пакетов DotEnv.jl и Telegram.jl для автоматизации отправки отчётов о ходе и результатах моделирования через бота Telegram.

Введение

Ранее мы уже рассматривали работу с Telegram в Engee - сгенерированный из модели Engee код, встроенный на ESP8266, принимал команды и отправлял отчёт в бота Telegram. Также, в одном из недавних примеров, мы предоставили необходимые материалы для управления Engee по API из внешних приложений. Однако внешний API Engee позволяет взаимодействовать с моделями лишь при помощи программного управления, что может показаться не таким всесторонним, гибким или простым способом внешней интеграции.

В этом примере мы погрузимся в саму модель Engee - дадим ей возможность обрабатывать результаты моделирования и отчитываться о своей работе, отправляя сообщения в Telegram-канал .

Переменные окружения

Для взаимодействия с ботом и каналом Telegram нам понадобятся две переменных - соответственно, токен бота, который выдаётся при его создании, и id канала, получить который внутри приложения таке не составляет труда. Обе эти переменные будет правильно определить в файле конфигурации окружения - .env. Он не отображается в файлово браузере Engee, но от там есть. Engee не отображает в файловом браузере файлы, начинающиеся с точки.
Для того, чтобы пример работал, вам необходимо получить токены собственных бота и id канала, и добавить их в файл .env.

In [ ]:
]add DotEnv # устанавливаем пакет для работы с файлом .env

Загрузим содержимое файла .env из файла:

In [ ]:
using DotEnv
cd(@__DIR__) # переходим в папку примера
isfile(".env") && DotEnv.load!() # загружаем .env из текущей папки

Добавляем необходимые переменные в рабочую область:

In [ ]:
BOT_TOKEN = ENV["BOT_TOKEN"];
CHAT_ID = ENV["CHAT_ID"];

Если у вас возникают сложности с работой в файле .env, токен и id можно определить здесь:

In [ ]:
# BOT_TOKEN = '8555970365:AAF0fcmjsJxWIjVUFUmyKrVYv6TtjCT1jeI'
# CHAT_ID = '-1003547189719'

‼️Будьте предельно аккуратны - опубличивание токена бота может привести к потере контроля над ботом.
Токен и id, указанные выше и в файле .env были намеренно отредактированы после подготовки примера.

Тестовая отправка сообщений

Переходим к работе с Telegram. Установим пакет Telegram.jl, дающий нам несколько методов для работы с API Telegram.

In [ ]:
]add Telegram

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

In [ ]:
EV = engee.version()
EV = replace(EV, r"([.-])" => s"\\\1")
Out[0]:
"25\\.12\\.2\\-H1"

Отправим сообщение в канал:

In [ ]:
using Telegram, Telegram.API

TelegramClient(BOT_TOKEN; chat_id = CHAT_ID) # создание Telegram-клиента - бот, с доступом к каналу
sendMessage(text = "*Привет из [Engee](https://engee.com/account/)\\!*\n\n`engee.version()`:\n>$EV",
            parse_mode = "MarkdownV2") # отправка сообщения с поддержкой разметки Markdown
Out[0]:
JSON3.Object{Vector{UInt8}, SubArray{UInt64, 1, Vector{UInt64}, Tuple{UnitRange{Int64}}, true}} with 7 entries:
  :message_id           => 505
  :sender_chat          => {…
  :chat                 => {…
  :date                 => 1769767359
  :text                 => "Привет из Engee!\n\nengee.version():\n25.12.2-H1"
  :entities             => Object[{…
  :link_preview_options => {…

В результате мы увидим следующее сообщение в канале:

image.png

Обратите внимание на поддержку разметки, а также экранирование пунктуации в отправляемом сообщении.

Применение Telegram API в моделировании

Теперь перейдём к более интересной интеграции Engee и Telegram с точки зрения модельно-ориентированного проектирования. Рассмотрим следующие пользовательские случаи:

  • вы запускаете модель с контролем времени выполнения - то есть, в условно реальном времени,
  • вы запускаете модель на длительное время выполнения,
  • вы запускаете "тяжёлую" модель.

Во всех этих случаях, вероятнее всего, вам придётся ждать длительное время до получения результатов. Чтобы не тратить рабочее время, наблюдая за движением графиков, вы можете добавить отправку сообщений боту Telegram в обратные вызовы, а в освободившееся время сделать перерыв - почитать свежие release-notes или интересные проекты в сообществе Engee. Вернётесь к модели, когда придёт уведомление от бота.

Модель этого примера - генератор синусоидального сигнала. В его настройках определён контроль времени выполнения. Engee старается выполнять модель со временем, практически равным реальному.

Интерес для нас сейчас составляют её обратные вызовы. Откроем вкладку PreLoadFunc:

image.png

Здесь содержатся уже знакомые нам строки кода. Далее, во вкладке PostLoadFunc мы увидим:

image.png

То есть, после открытия модели в Telegram канал придёт уведомление об открытии модели с её данными. Далее, вкладка StartFunc:

image.png

Самое интересное на вкладке StopFunc :

image.png

Давайте запустим модель, и посмотрим, как это работает:

Всё работает так, как мы и планировали. Поставим считаться модель и пойдём на обед.

Заключение

Далее возможно реализовать "обратную связь" - например, управление аккаунтом Engee, расчётами и моделированием через команды бота. Эту модель вы можете использовать как шаблон для автоматизации отчётов в своих проектах. Только не забудьте добавить свои токены для бота и id канала Telegram.