Реализация функционала "Тревожная кнопка" на WB

Здравствуйте.
Пытаюсь на WB7 реализовать “тревожную” кнопку. Логика несложная. Есть 3 кнопки. По нажатию идёт вызов на телефон охраны.
Подключил кнопки ко входам WBIO-DI-WD-14, добавил виртуальное устройство с контролами, отображающими состояние кнопок, скрипт взял отсюда. Вроде всё просто, но при тестировании появились проблема – после нажатия на кнопку вижу в виртуальном устройстве, что контроллер реагирует, однако вызов проходит не всегда.
Подскажите, пожалуйста, что может быть причиной? Или, может, какие-то есть нюансы настройки? В общем, вопрос, как сделать так, чтобы после нажатия на кнопку вызов проходил 100%?
И ещё вопрос.
Можно ли для указанного функционала (подключение кнопок) использовать дискретные входы контроллера?

Добрый день.

Скрипт - выложен пользователем (интегратором).

Рекомендую добавить вывод в лог в ключевые моменты передаваемых параметров.
Ну и определить таким оразом что именно и на каком этапе выполнения не работает.
То есть - сравить парметры с ожидаемыми.

Да, можно.

Спасибо.
Сегодня попробовал подключить кнопку к дискретному входу WB. Работает, вроде, устойчивее, но удерживал кнопку в нажатом состоянии немного дольше обычного и результат был стабильным.
В связи с чем вопрос: можно ли подключить к дискретному входу выключатель с фиксацией, чтобы уж контакт замкнулся, так замкнулся?

Да, можно.

В продолжение темы надёжности.
Подскажите, пожалуйста, на тот случай, если команда дозвона не выполнилась и exitCode в exitCallback вернул не 0, можно ли внутри exitCallback сделать ещё один вызов runShellCommand с набором этого же номера, а если не получилось, то отправить SMS через Notify.sendSMS(...) или это идея корявая и есть какой-то более идеологически верный путь?

Ну, типично все ж запускают цикл напримр тиз трех-четырех попыток, если попытка в цикле успешна - цикл прерывается.
Если за время цикла не было ни одной успешной - можно выполнить и другое действие. А вызов непосредственно из каллбэка - хороший шанс зациклить.

Да, спасибо, действительно, с циклом круто. А то у меня выходит корявая рекурсия.
Ещё вопрос по callback от Notify.sendSMS(...). Подскажите, пожалуйста, как с этой команды снимать обратную связь? В интернете по этому методу информацию не нашел, только здесь. Проверил, что возвращает Notify.sendSMS(...). – в log пишет undefined.

Насколько вижу в исходниках - статус не предусмотрен, совсем.

Ясно.
Почесал затылок и решил принимать каллбэк таким образом:

function alarm_sms(phone_number, message){
  runShellCommand("mmcli -m wbc --messaging-create-sms='text=\"" + message + "\",number=\"" + phone_number + "\"'", {
        captureOutput: true, //Захватывать stdout
        captureErrorOutput: true, //Захватывать stderr (если нужно)
        exitCallback: function (exitCode, capturedOutput, capturedErrorOutput) //Функция, в которую попадает вывод
              {
                  var sms_count = capturedOutput.substr(65);
                  sms_count = sms_count.replace(/\n/g, '');
                  log("cmd output: " + capturedOutput); //строка полностью
                  log("sms number: " + sms_count);
                  var sms_command = "mmcli -s " + sms_count + " --send";
                  log("sms_command: " + sms_command);
                  runShellCommand(sms_command); 
                  log("cmd Erroroutput: " + capturedErrorOutput);
                  var delete_command = "mmcli -m wbc --messaging-delete-sms=/org/freedesktop/ModemManager1/SMS/" + sms_count;
                  runShellCommand(delete_command);
                  if (exitCode){
                    log.error("Попытка отправить SMS не удалась");
                    
                  }
              }
           });
}
1 лайк

Да, хорошее решение. Собстввенно Notify.sendSMS() - это легаси, оставшееся с тех времен когда ModemManager’a не было. Ну и работа шла наприямую с модемом, AT-командами.