Проверил еще на контроллере WB6.7. Создал правило, в котором раз в пять секунд отправляю команды датчику и делаю запись в лог. Правило отрабатывает стабильно, хоть загрузка процессора иногда и возрастает.
В том, что правило отрабатывает корректно, сомнений нет, проблемы начинаются после.
Я снял небольшое видео, иллюстрирующее проблему, о которой я говорил выше: пока wb-zigbee разбирает сообщение, он так грузит wb-rules, что другие правила не срабатывают.
Видео не поместилось, поэтому ссылка: Запись экрана 1 от 14 сентября.avi — Яндекс.Диск.
Что происходит:
(вообще весь экшн с 20й секунды)
открыто окно с виджетами - нас интересует виджет “коридор”, где “Основной” (свет) триггерит смену состояния “Дополнительного”
Правило
defineRule("hall_2nd_light", {
whenChanged: "wb-mr6c_26/K1",
then: function (newValue, devName, cellName) {
dev["wb-mr6cu_84"]["K1"] = dev["wb-mr6c_26"]["K1"];
}
});
Открыто окно “Устройства”, где, собственно WB-MSW-v3 zigbee и его состояние.
Открыта консоль с top и консоль, в которой я периодически запрашиваю статус zigbee2mqtt
В момент, когда приходят события от датчика (сейчас это происходит раз в минуту), растет потребление %CPU сервисом wb-rules. В этот же момент, я выключаю “Основной” свет в коридоре и жду. Проходит несколько секунд прежде, чем срабатывает правило. Чуть позже, когда процесс wb-rules начинает “отпускать”, видно, что срабатывание этого правила занимает > 1 с.
Я пребываю в уверенности, что такое поведение контроллера автоматизации является ошибкой. Иными словами, так быть не должно, верно?
Да, наблюдаю похожее поведение: при получении данных от датчика выполнение правил немного (около секунды) подтормаживает.
Попробуйте еще изменить политику процессора, будет ли улучшение: Wb-rules грузит процессор - #2 от пользователя EvgenyBoger
Нет, явного улучшения не произошло, при получении данных от датчика выполнение правил подтормаживает на несколько секунд.
Спрошу совета у разработчиков.
@webconn Что еще можно посоветовать пользователю, чтобы не было задержки в выполнении правил при получении сообщений от zigbee-устройств?
Попробуйте все-таки настроить датчик, чтобы сообщения приходили не чаще, чем раз в 5-10 с, увеличив параметры:
Также можно попробовать отключить веб-интерфейс zigbee2mqtt для снижения потребления ресурсов: Подключение устройств Zigbee к контроллеру Wiren Board — Wiren Board
Веб-интерфейс zigbee2mqtt отключен. Я видел в документации предупреждение, поэтому включал его только под конкретные цели, затем отключал.
Попытался “размазать” отправку датчиком сообщений по времени, но не получилось. Насколько я понимаю, каждый канал отправляет теперь данные раз в минуту. Но, они делают это с паузой в секунду между собой (не получилось добавить паузу в 10 секунд между ними), то есть я получаю 6 сообщений подряд, что все равно грузит.
Я понимаю, что конкретно сейчас есть всего пара решений:
- “растянуть” отправку событий так, чтобы они не грузили процесс (не все параметры хочется получать с большой паузой)
- приобрести внешний zigbee-хаб, поддерживающий zigbee2mqtt (все-таки хотелось бы, что бы “мозгом” автоматизации - сенсоров и акторов - было одно устройство)
Но, может, хотя бы удастся определить точную причину и предложить системное решение?
Если такие большие задержки только при подключенном датчике WB-MSW Zigbee v3, то для проверки - удалить все правила с контроллера, кроме одного минимального, управляющего датчиком. Так как у меня при этом задержки небольшие - около 1 с.
Также можно попробовать удалить пакет wb-zigbee2mqtt и проверить нагрузку на процессор без него. Но без этого пакета парсить топики zigbee2mqtt нужно будет самостоятельно и для этого также потребуются ресурсы.
Даже в рамках этого обсуждения, проблема воспроизводилась и на WB-MSW Zigbee v3, и на двигателях для штор, которые во время движения активно слали сообщения.
Более того, мне кажется, мы уже выяснили, что проблема не в отправке сообщения в zigbee, а в приёме при большом количестве сообщений в секунду.
Если такие большие задержки только при подключенном датчике WB-MSW Zigbee v3, то для проверки - удалить все правила с контроллера, кроме одного минимального, управляющего датчиком. Так как у меня при этом задержки небольшие - около 1 с.
Без изменений. Нагрузка сохраняется и при удаленных правилах, кроме управляющего датчиком, и при удаленных вообще.
Также можно попробовать удалить пакет wb-zigbee2mqtt и проверить нагрузку на процессор без него. Но без этого пакета парсить топики zigbee2mqtt нужно будет самостоятельно и для этого также потребуются ресурсы.
При удаленном пакете wb-zigbee2mqtt - нагрузки нет.
Вообще получается, что код обработки сообщений из топиков zigbee2mqtt и грузит процесс. С этим будут что-то делать или мне необходимо решать этот вопрос самостоятельно?
Запишу ваше обращение, чтобы обратить на это внимание разработчиков.
Пока не планируем что-то переделывать, так как не удается воспроизвести точно такое же поведение. Та задержка, которую наблюдаю - сейчас неизбежна, но и не так критична.
Ок, я понял. Задержка в несколько секунд, которую я демонстрировал на скринкасте, для wirenboard является некритичной.
Я не считаю, что вопрос решён, но обсуждать больше нечего, спасибо.
Мы не сможем исправить то, что не получается воспроизвести. Сообщите еще раз минимальную конфигурацию оборудования и пришлите полностью ваше правило, чтобы воспроизвести задержку в несколько секунд.
Также могу предложить вам скидку на покупку контроллера Wirenboard 7, на нем обработка должна производиться быстрее.
WB-6.6
WBE2R-R-ZIGBEE v.1
WB-MSW v.3 Zigbee или любое другое устройство, поддерживаемое в zigbee2mqtt
Задержка проявляется при получении сообщений от zigbee-устройств и не зависит от каких-либо правил, кроме правила, разбирающего json из топиков zigbee2mqtt и публикующего значения в соответствующие топики устройств.
Сама по себе задержка может проявиться в течении нескольких часов после перезапуска контроллера.
Правило
defineRule("WB-MSW-v3_badroom_rules_CO2", {
whenChanged: "WB-MSW-v3_badroom/co2",
then: function(newValue, devName, cellName) {
log(newValue + " ppm");
var co2_good = newValue <= 1000;
var co2_okay = newValue > 1000 && newValue <= 2500;
var co2_bad = newValue > 2500;
if(co2_good) {
// no lights
publish('zigbee2mqtt/WB-MSW-v3_badroom/set', JSON.stringify({"state_l1": "OFF"}), 2, false);
publish('zigbee2mqtt/WB-MSW-v3_badroom/set', JSON.stringify({"state_l2": "OFF"}), 2, false);
}
else if(co2_okay) {
// green
publish('zigbee2mqtt/WB-MSW-v3_badroom/set', JSON.stringify({"state_l1": "OFF"}), 2, false);
publish('zigbee2mqtt/WB-MSW-v3_badroom/set', JSON.stringify({"state_l2": "ON"}), 2, false);
}
else if(co2_okay) {
// red
publish('zigbee2mqtt/WB-MSW-v3_badroom/set', JSON.stringify({"state_l1": "ON"}), 2, false);
publish('zigbee2mqtt/WB-MSW-v3_badroom/set', JSON.stringify({"state_l2": "OFF"}), 2, false);
}
}
});
Никак не получается воспроизвести. В одном правиле у меня выводятся сообщения в лог раз в две секунды для проверки, что другие правила отрабатывают. В другом правиле ваш код. Предполагаю, что в коде есть опечатка в последнем else if(co2_okay) {
нужно заменить на co2_bad
для правильной индикации.
Видео прилагаю.
Попробуйте обновить пакет zigbee2mqtt до версии 1.25.2 из нашего репозитория. Я тестировал на ней.
Предлагаю попробовать сбросить контроллер к заводским настройкам с помощью самого нового образа и настроить все еще раз заново.