Перестают работать wb-rules с ошибкой [wbgo_mqtt] MQTT token wait timeout: *mqtt.PublishToken

Приветствую, контроллер wb7


Подключено около 55 сериал устройств на 3х линиях и один датчик зигби. Падают правила с ошибкой подключения к брокеру (ERROR: [wbgo_mqtt] MQTT token wait timeout: *mqtt.PublishToken (&{{{{0 0} 0 0 {{} 0} {{} 0}} 0x1984c40 } 50940}) ) при: сохранении/изменении больших файлов правил, перезагрузке контроллера, перезагрузке mosquitto, перезагрузке wb-rules. Возможно они падают и от других действий, но эти мне удалось выявить наверняка. Ошибка проявилась недавно при изменении правила и до этого не возникала, контроллер несколько месяцев работал стабильно с текущими правилами, которые не сильно изменялись.
Метод восстановления нормальной работы, на данный момент, выглядит так: остановка wb-mqtt-serial → рестарт wb-rules (занимает несколько минут) → запуск wb-mqtt-serial. После этих действий контроллер работает без ошибок.
Сбрасывал контроллер к заводским настройкам, но безрезультатно. Прикладываю диагностический архив, текст и скрины логов.


log_20250301T143159.log (158,5 КБ)
diag_AA6QMN3S_2025-03-02-02.32.34.zip (341,6 КБ)

Добрый день.
Процесс wb-rules занимает довольно много ресурсов:

root     23914 54.4  1.9 898736 39428 ?        Ssl  Mar01 396:11 /usr/bin/wb-rules -syslog -editdir /etc/wb-rules/ /usr/share/wb-rules-system/rules/ /etc/wb-rules/ /usr/share/wb-rules/

Причем как по процессору так и по памяти.
Точно ли в нем нет рекурсивного создания правил? Очень похоже по симптомам.

Здравствуйте, проверил все, рекурсивного создания правил нет (могу приложить архив с правилами, если требуется), но самих правил создается достаточно много, возможно проблема в количестве? Еще смущает, что проблема проявилась только недавно после обновления, раньше ее не было

Добрый день.
Подобные ошибки (переполнение очереди) получается, обычно эмулировать так:

//03_10_test_01.js
function makeNewRule(aa, bb){
  defineRule("RuleFor"+aa, {
  whenChanged: aa,
    then: function(value) {
      dev[bb] = value;
      log.info("makeNewRule");
      makeNewRule(aa, bb)
    }
})
};

makeNewRule("power_status/Vin", "buzzer/frequency");

То есть созданием большого массива правил.
Хороший способ убедиться что правила не создаются в процессе - добавить в лог вывод, именно при создании каждого правила.
Если есть способ (метод) позволяющий воспроизвести ошибку не создавая тысячи правил - поделитесь, проверю.