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

В документации в табличке указаны значения.

Скрипт - это правило, написанное на wb-rules. То есть для парсинга топиков используются тоже wb-rules.

Не думаю, что с этим может быть связано.

В документации в табличке указаны значения.

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

В данный момент единственное устройство, которое я оставил - датчик WB-MSWv3. К сожалению, нагрузку на процессор или хотя бы потребление конкретного процесса я вывести в виде графика не могу, но визуально наблюдаю скачки нагрузки у процесса wb-rules, то есть проблема сохраняется.

Я верно понимаю, что на стенде подобное поведение получить не удалось?

Я не знаю точно насколько. Попробуйте для теста увеличить минимальный интервал в 2 раза, в 5 раз.
Чего-то явно проблемного с зависанием правил на некоторое время получить пока не получается.

Переделал на 1 раз в минуту. Данные приходят 6 раз, судя по всему, по каждому из показателей.
Вот пример (пэйлод я обрезал):

Sep 08 17:08:07 wirenboard-AMWQEWLS npm[29934]: Zigbee2MQTT:info  2022-09-08 17:08:07: MQTT publish: topic 'zigbee2mqtt/WB-MSW-v3_badroom', payload '{"co2":1031,...
Sep 08 17:08:09 wirenboard-AMWQEWLS npm[29934]: Zigbee2MQTT:info  2022-09-08 17:08:09: MQTT publish: topic 'zigbee2mqtt/WB-MSW-v3_badroom', payload '{"co2":1031,...
Sep 08 17:08:09 wirenboard-AMWQEWLS npm[29934]: Zigbee2MQTT:info  2022-09-08 17:08:09: MQTT publish: topic 'zigbee2mqtt/WB-MSW-v3_badroom', payload '{"co2":1031,...
Sep 08 17:08:09 wirenboard-AMWQEWLS npm[29934]: Zigbee2MQTT:info  2022-09-08 17:08:09: MQTT publish: topic 'zigbee2mqtt/WB-MSW-v3_badroom', payload '{"co2":1031,...
Sep 08 17:08:09 wirenboard-AMWQEWLS npm[29934]: Zigbee2MQTT:info  2022-09-08 17:08:09: MQTT publish: topic 'zigbee2mqtt/WB-MSW-v3_badroom', payload '{"co2":1031,...
Sep 08 17:08:16 wirenboard-AMWQEWLS npm[29934]: Zigbee2MQTT:info  2022-09-08 17:08:16: MQTT publish: topic 'zigbee2mqtt/WB-MSW-v3_badroom', payload '{"co2":1031,...

Соответственно top в момент, когда приходят данные, показывает высокую нагрузку на wb-rules (>50%), потом примерно 40 секунд низкой нагрузки (<10%). Пока идёт нагрузка - правила работают с задержкой (зависают).

Да, наблюдаю похожее поведение. После отправки команды на включение светодиодов начинают приходить данные с датчика WB-MSW Zigbee v3. В это время наблюдается относительно большая загрузка правил. Но выполняться правила совсем не перестают (тестирую правда на контроллере Wirenboard 7). Думаю, что с этим пока ничего не сделать. Попробуйте отправлять команды датчику не одновременно, а через интервал времени:

publish('zigbee2mqtt/0x04cd15fffea0b238/set', JSON.stringify({"state_l2": "OFF"}), 2, false);
setTimeout( function () {
 publish('zigbee2mqtt/0x04cd15fffea0b238/set', JSON.stringify({"state_l1": "OFF"}), 2, false); 
}, 2000);

“Относительно большая нагрузка правил” на WB7 превращается в “тормозят правила” на WB6.
Причем правила тормозят не только при отправке команд, а, как я писал выше, каждый раз, когда мне приходят данные от датчика.

Подведу предварительный итог.
Симптомы: при активной обработке сообщений от зигби-устройств резко растет загрузка процесса wb-rules. Когда нагрузка заканчивается - правила, которые должны были сработать во время “зависания”, отрабатывают.
Решение: отсутствует.

Я нашёл еще одну тему, кажется, со сходными симптомами: Большая задержка при обработке событий от zigbee2mqtt

Очень не хочется к этому апеллировать, но как так получается, я купил устройства с заявленной поддержкой от производителя (датчик, плата и контроллер - все производство WirenBoard) на ощутимую сумму, но от поддержки я получаю ответ: “Думаю, что с этим пока ничего не сделать”? Что мне теперь с этим датчиком делать, отключить, убрать в коробку и радоваться, что дополнительные кнопки, включающие свет, или вытяжка в санузле работают без задержек?

1 лайк

Проверил еще на контроллере 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 из нашего репозитория. Я тестировал на ней.
Предлагаю попробовать сбросить контроллер к заводским настройкам с помощью самого нового образа и настроить все еще раз заново.