Что я не так делаю в настройке telegram2wb?

Здравствуйте!
Тема уже поднималась мной. Прошло время, немного стал больше понимать в wb-rules, однако telegram2wb у меня так и не заработал. Ниже опишу, что я делаю, тыкните, пожалуйста, носом, где ошибаюсь.
В общем, установка предельно понятна – скопировать telegram2wb.js в /etc/wb-rules-modules/. Далее – настройка. Тоже всё просто:

var bot = require("telegram2wb"); 

token = "123:ABC"; 
allowUsers = ["myUserName"]; 
deviceName = "telegram2wb";
cmdTopic = "{}/{}".format(deviceName, bot.mqttCmd);
msgTopic = "{}/{}".format(deviceName, bot.mqttMsg);
rawMsgTopic = "{}/{}".format(deviceName, bot.mqttRawMsg);
callbackTopic = "{}/{}".format(deviceName, bot.mqttCallback);

bot.init(token, allowUsers);

Беру пример автора модуля:

defineRule("bot_cmd_controller", {
    whenChanged: cmdTopic,
    then: function (newValue, devName, cellName) {

        cmd = JSON.parse(newValue);
        dev[devName][cellName] = "{}";

        if (!isEmptyJson(cmd)) { // Проверяем, что команда не пустая
            botname = bot.getUserName();

            // Если сообщение групповое, то проверяем адресата. Если адресовано не нам, то игнорируем.
            if (cmd.chatType === "group"
                && cmd.mentions.indexOf(bot.getUserName()) === -1) {
                return;
            }

            switch (cmd.command) {
                case "/start":
                case "/help":
                    cmdHelp(cmd)
                    break;
                case "/getfile":
                    cmdGetFile(cmd)
                    break;
                case "/cputemp":
                    cmdCPUTemp(cmd)
                    break;
                case "/kbd":                
                    cmdKbd(cmd)
                    break;
                case "/kbd":                
                    cmdKbd(cmd)
                    break;
                case "Inline keyboard":   
                    cmdInlineKeyboard(cmd)
                    break;              
                case "Close keyboard": 
                    cmdCloseKeyboard(cmd)
                    break;
                default:
                    cmdUnknown(cmd);
                    break;
            }
        }
    }
});

Здесь тоже всё понятно. Правило “слушает” топик cmdTopic, извлекает команду из JSON и, в зависимости от того, что пришло, запускает обработчик.
Вот пример одного из обработчиков:

function cmdHelp(cmd) {
    text = "Привет, я бот контроллера Wiren Board \nЯ знаю команды:\n"
    text += "/start или /help — справка\n"
    text += '/getfile "/path/filename.txt" — пришлю указанный файл\n'
    text += '/cputemp — температура процессора\n'
    text += '/kbd — клавиатура\n'

    sendMsg(cmd.chatId, text, cmd.messageId);
}

Он просто пишет в чат текстовое сообщение.
Включаю режим Debug и отправляю в чате с ботом команду /help. В логах появляется:

Apr 30 18:57:58 wirenboard-A6X*** wb-rules[12477]: INFO: [rule info] telegram2wb: [getMessages] 
                                                      |→ exitCode: 0 | capturedOutput:{"ok":true,"result":[{"update_id":799567776,
                                                     "message":{"message_id":1446,"from":{"id":123,"is_bot":false,"first_name":"V***v","username":"v***n","language_code":"ru"},"chat":{"id":123,"first_name":"V***v","username":"v***n","type":"private"},"date":1746028678,"text":"/help","entities":[{"offset":0,"length":5,"type":"bot_command"}]}}]}

Ага, значит модуль сообщение принял, однако, дальнейшая обработка не осуществляется. Уже весь вечер потратил на это, но понять так и не смог, почему сообщение не обрабатывается и не отправляется ответ в чат. Пробовал использовать топик реле и менять состояние вручную через виртуальное устройство – функция sendMsg(cmd.chatId, text, cmd.messageId) отрабатывает штатно.
Такое впечатление, что

defineRule("bot_cmd_controller", {
    whenChanged: cmdTopic,
    then: function (newValue, devName, cellName)

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

UPD…
Да, и еще.
Почему-то в виртуальном устройстве в топике CMD постоянно висит и не меняется только

{"chatId":123,"chatType":"private","mentions":[],"messageId":1,"command":"/start","args":""}

Другие топики, при этом, пустые…

UPD…UPD…
Попробовал на другом контроллере. Всё запустилось с “полпинка”. Предположу, что проблема именно в том, что сообщение

{"chatId":123,"chatType":"private","mentions":[],"messageId":1,"command":"/start","args":""}

“застряло” в топике. В связи с чем вопрос. Подскажите, пожалуйста, как привести wb-rules в состояние до установки модуля telegram2wb? Удаление файла с модулем и перезагрузка службы wb-rules не помогла – указанное выше сообщение всё равно присутствует в топике.

Добрый день.

Можно банально сделать

dev[cmdTopic] = ""

После запуска модуля.
То есть после bot.init
Запускается - топик чистится.

Спасибо, большое – сработало.

1 лайк

Да, воспроизвел. Но непустое значение после перезапуска брокера (или контроллера целиком) - удаляется. Но, да, может быть при пересозранении самого правила. У вас хорошее описание, качественное. Прямо удовольствие читать.