Перестают работать правила wb-rules при включенном zigbee2mqtt

Проверил еще на контроллере 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 сообщений подряд, что все равно грузит.
image

Я понимаю, что конкретно сейчас есть всего пара решений:

  • “растянуть” отправку событий так, чтобы они не грузили процесс (не все параметры хочется получать с большой паузой)
  • приобрести внешний 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 из нашего репозитория. Я тестировал на ней.
Предлагаю попробовать сбросить контроллер к заводским настройкам с помощью самого нового образа и настроить все еще раз заново.