Здравствуйте!
Тема уже поднималась мной. Прошло время, немного стал больше понимать в 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 не помогла – указанное выше сообщение всё равно присутствует в топике.