В предыдущем блоге мы подключились к сереверу golos.io по вебсокету и получили ответ от сервера на наш запрос. Вернее последнее событие из истории аккаунта и его ID. Такой запрос мы будем отправлять периодически, поэтому нам надо сохранять где то полученный ID и проверять, не изменился ли он с последнего опроса сервера. Если изменился, то мы посылаем уведомление.
Чтобы проверить изменился ли ID мы добавим на сцену функциональную ноду Switch (русск. Переключатель).
Нода Switch может проверять значение msg.payload и в зависимости от того соблюдается ли заданное условие, перенаправлять поток на определенный выход или не пропускать сообщение дальше вообще. У этой ноды могут быть несколько выходов.
Это эквивалентно чему то подобному на яваскрипте
if(msg.payload == “on”) {
return msg;
} else if(msg.payload == “off”) {
return msg;
}
Откройте окно с настройками ноды switch. В качестве имени задайте к примеру “Сменился ID?”, В качестве Property (русск. Свойство) в качестве объекта сравнения выберите “flow.” и имя атрибута задайте lastId (русск. Последний ID).
Кстати обращайте на написание переменных, имен атрибутов. Javascript чувствителен к регистру, иначе говоря “lastId” не равно “lastid”.
Ниже у нас располагаются условия. Сколько условий сравнения у нас, столько и выходов у этой ноды Switch.
В первом условии мы выберем “is null” (русск. является пустым). Дело в том, что при самом первом запуске атрибут flow.lastId еще не будет установлен (пустой). Естественно при первой проверке полученный от сервера ID не будет совпадать с сохраненным, которого вообще нет. В итоге мы бы получили при первом запуске беспочвенное сообщение. Что бы избежать этого мы проверим flow.lastId на null и если null, то ничего не будем слать в telegram.
В самом низу выберите из списка “stopping after first match”. Что означает “останавливаться после первого совпадения”. То есть если у нас переменная flow.lastId еще не установлена, то второе условие мы проверять не будем.
Под боксом с условиями есть кнопка “Add” (русск. Добавить). Добавьте еще одно условие. Во втором условии оператор сравнения выберите “!=” (не равно) и в качестве объекта сравнения выберите msg., а атрибут введите “payload”.
Чтобы сохранить ID мы добавим на сценарий ноду Changе. В настройках этой ноды задайте имя “Сохранить ID в кэше”, а в правилах (Rule) выберите “Set”, в качестве модифицируемого объекта выберите “flow.” и задайте имя атрибута “lastId”. А в качестве источника данных выберите “msg.” и введите атрибут “payload”.
Подсоедините оба выхода ноды Switch на вход ноды Change которая сохраняет последний ID как на иллюстрации.
Мы соединили оба выхода с нодой Change, чтобы в любом случае сохранять ID, если flow.lastId пустая и если она сменилась. Ноду Change “Сохранить ID” никуда подключать не надо, она сделала свое дело.
Собственно осталось только послать сообщение в чат telegram. Для этого надо установить из репозитория нод, ноду для telegram. Для этого в меню выберите “Manage palette”.
Слева палитра сменится панелью управления палитрой. Выберите вкладку “Install” и в строке поиска введите “telegram”. У меня показывает два доступных модуля telegram. Telegrambot и telegrambot-plus. Мы будем использовать вариант без приставки “plus”. Для установки нажмите кнопку Install.
После установки модуля нажмите на панели палитры кнопку Done и пролистайте вниз. Там будут новые ноды для работы с telegram.
Нам понадобится “Telegram Sender” для отсылки сообщений. Добавьте ноду на сценарий.
Теперь нам надо будет создать бота telegram. Как это делать я не буду описывать детально, так как на эту тему есть несчетное количество инструкций. По сути нужен только сам бот. Я в telegram попросил BotFather-а создать нового бота в итоге бот был создан и я получил API токен для бота.
Откройте свойства ноды “Telegram Sender” и нажмите кнопку с карандашом, чтобы добавить бота telegram.
Задайте имя бота и токен. В поля users и chatids введите открывающиеся и закрывающиеся квадратные скобки “[]” (пустой массив).
Нажмите кнопку Add и сохраните настройки бота и настройки ноды.
Чтобы послать сообщение необходим еще и chatId чата с ботом. Для того, чтобы узнать chatId мы сделаем короткую цепочку из ноды “Telegram Receiver” (приемник Telegram) и отладочной ноды Debug. Откройте конфигурационную панель ноды “Telegram Receiver”, задайте имя и выберите из списка ранее сконфигурированного бота.
Подключите оба выхода ноды Telegram Receiver ноды. На первом выходе появляются сообщения от авторизованных пользователей, а на втором выходе от неавторизованных. У нас все неавторизованные.
Задеплойте все, найдите в Telegram вашего бота и начните с ним чат. Пошлите какое нибудь сообщение и посмотрите в отладочном окне Node-RED. Вы должны были получить сообщение.
Собственно осталось только сформировать осмысленное сообщение и отослать его нашему боту.
Добавьте на сценарий ноду Change. Что бы отослать сообщение боту Telegram нужно послать json следующего вида.
{ “chatId”:”191909222”, “type”:”message”, “content”:”Движение в вашем аккаунте”}
Откройте панель свойств новой ноды Change и заполните как на иллюстрации. Соответственно замените ChatID на свой. Строки с действиями добавляются кнопкой “Add” в самом низу.
Первой строкой мы создаем Json, а потом присваиваем необходимые атрибуты. Сохраните изменения и подключите ноды как на иллюстрации ниже. Не забудьте изменить chatId на ID вашего чата.
Чтобы не ждать милостей от природы и новых изменений в своем аккаунте можно добавить отладочную ноду Inject и подключить ее к ноде Change с именем “Сохранить ID в кэше”. В свойствах ноды вместо timestamp выберите string и введите значение “1”.
Нажав на кнопку этой ноды Inject мы выставим flow.lastId в 1 и при следующем опросе сервера нам в любом случае придет сообщение.
Теперь задеплойте все и нажмите на ноде Inject которая сбрасывает flow.chatId, а потом на первой ноде Inject.
Вы должны были получить сообщение в ваш чат с ботом.
Теперь если нажимать кнопку на первой ноде Inject ничего не будет происходить, пока не будет изменений в вашем аккаунте.
Последним штрихом сделаем периодический опрос сервера. Для этого рядом с нодой Change с именем “get_account_history(ropox)” добавьте из палитру ноду Delay. Подключите вход ноды Delay к выходу ноды Change и вход ноды Change с выходом ноды Delay. Задержку можно оставить как есть 5 секунд. Получился цикл с задержкой 5 секунд в теле цикла.
Задеплойте все и нажмите на кнопку первой ноды Inject. Осталось только дождаться изменений в аккаунте или для симуляции сбрасывайте lastId второй нодой Inject.
В итоге сценарий выглядит следующим образом.
А это результат в telegram.
В следующем блоге о Node-RED я думаю продолжить тему расширив посылаемое сообщение дополнительной информацией и попутно думаю ввести фильтрацию событий.
Кстати, чтобы повысить качество статьи я раздам 20 золотых за дельные замечания.