Ошибки и предложения

В этом разделе вы можете проголосовать за идеи по открытым проектам. Вы всегда можете предложить свою идею, перейдя на страницу проекта.

Спасибо!

Мы очень рады, что Вам нравится данный проект и вы проголосовали за его развитие.

Работа над задачами по проекту отнимает у его разработчика самое ценное — время, так что небольшая компенсация в виде материальной поддержки поднимет интерес к разработке и позволит сделать больше задач для общей пользы :)

Перейти к проекту Нет, спасибо

<<< Назад

Проверка доступности устройства перед его опросом

Добавлено: 2020-10-25 20:20:01 / Статус: Новая / Проект: Модуль Broadlink

https://github.com/nick7zmail/MajorDoMo-dev_broadl...

Я готов подготовить PR еще для одной проблемы но требуется обсуждение и одбрямс :)

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

Причина в том, что модуль опрашивает все устройства подряд (dev_broadlink_check.inc.php#78), независимо от того, доступны ли они в текущий момент или нет. В результате опрос offline устройства занимает до 10 секунд (константа Broadlink->$timeout). А некоторые устройства (тот же HYSEN) опрашиваются в несколько последовательных вызовов и время, соответственно, возрастает кратно.

Проблема более-менее эффективно решается если внутри цикла опроса сделать ping на устройство и проверить результаты (dev_broadlink_check.inc.php#84):
if(!is_null($rm) && $rm->ping() ) {
Я поигрался с этим workaround'ом, выставив таймаут в 500мс. В результате все работает как положено и даже при 10 недоступных устройствах (8 термостатов, RM4Pro и RM4mini) задержка составляет меньше 6 секунд. Успешный ping у меня отрабатывает 10-50мс, здесь тоже говорить не о чем.

НО

Метод ping() уже реализован в базовом классе. И в нем вроде бы все хорошо - за одним исключением: по умолчанию используется UDP ping, который не работает ни с одним из моих устройств. В отличие от ICMP, который (насколько я понимаю) в локальной сети должен отрабатывать практически всегда. Но поскольку у меня нет возможности проверить это на всем зоопарке поддерживаемых устройств а последствия неправильно работающей проверки будут фатальны - вопрос: насколько безопасно будет перевернуть логику, сделав ICMP ping основным, а UDP - на правах исключения для устройств там, где это действительно необходимо?

Безопасности можно добавить, реализовав checkbox "проверять доступность устройств" на странице настроек, выключенный по умолчанию.

м?

+2
 
Обсуждение (0)