Bugs and Suggestions

Here you can vote for ideas by projects. You can add your ideas to any open project from the project's page.

Спасибо!

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

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

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

<<< Back

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

Added by: 2020-10-25 20:20:01 / Status: New / Project: Модуль 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
 
Discuss (0)