У меня стойкое ощущение, что это как-то связано именно с последовательностью событий, которые происходят после нажатия кнопки “Сохранить” в редакторе правил. Кстати, если ее нажать подряд несколько раз, то лог оказывается наполнен вот такими записями:
Добрый день. Я предлагаю понаблюдать за поведением системы некоторое время, повлияло ли добавление таймаута на “зависание” отправки sms. Что касается записей в журнале событий, каждое сохранение скрипта вызывает полный перезапуск движка wb-rules: все правила выгружаются, скрипт перечитывается, виртуальные устройства регистрируются заново — движок переподписывается на топики и публикует retained-значения в брокер. На это уходит несколько секунд, в течение которых все правила не работают.
Что происходит при многократном нажатии.
Каждое новое сохранение запускает очередной перезапуск, не дожидаясь завершения предыдущего. Брокер получает лавину одновременных подписок и публикаций, токены зависают и через 10 секунд получают timeout — отсюда и лог с ошибками MQTT token wait timeout с ровным интервалом 10 с. После того как все перезапуски отработают, система восстанавливается сама. Каждое нажатие — это кратковременная слепота всей автоматики. Если правила управляют реальным оборудованием (реле, обогреватели — как BathTambHeater в вашем случае), в момент перезапуска триггеры не срабатывают. Сохранять стоит один раз, убедившись что правило готово, и сразу проверять лог.
Благодарю за бдительность, я поговорю с коллегами, дополним документацию.
Добрый день! Здесь два момента важны, на мой взгляд:
То, что, по-хорошему, кнопка “Сохранить” в редакторе правил должна бы становиться не активной до завершения перезапуска и предотвращения лавинообразных вызовов.
Ранее уже писал о том, что сильно не хватает кнопки типа “Проверить скрипт”, тогда не придется регулярно нажимать “Сохранить”, чтобы проверить синтаксиc.
Не согласен. Вчера более полутора часов сыпались ошибки
Дополню еще, раз уж коснулись интерфейса редактора скриптов, что сильно нужно предупреждение о попытке закрыть вкладку редактора или уйти с нее при наличии несохраненных изменений. В нынешней реализации крайне высокий риск потерять несохраненный (измененный) скрипт случайным ошибочным нажатием в интерфейсе.
Если посмотреть изначальный журнал событий, то видно, что ошибки идут ровно каждые 10 секунд, все связаны с устройством BathTambHeater, и это именно топики контролов, которые создаются динамически в rules.js. MQTT-брокер перегружен очередью publish/subscribe токенов и не успевает их подтверждать за таймаут (10с). Это симптом лавины MQTT-операций — каждое нажатие кнопки “Сохранить” в веб-интерфейсе вызывает перезагрузку rules.js, который заново создаёт виртуальное устройство BathTambHeater со всеми его контролами.
В файле rules.js есть безусловные присвоения вида
dev[‘BathTambHeater/objectName’] = ‘Тамбур бани’;
Каждое из этих присвоений генерирует MQTT publish. При нескольких быстрых нажатиях “Сохранить” эти операции накапливаются быстрее, чем брокер успевает их обработать.
Дополнительная проверка - “присвоить, только если значение пустое” избавится от переполнения, к примеру:
if (dev[‘BathTambHeater/objectName’] === ‘’) dev[‘BathTambHeater/objectName’] = ‘Тамбур бани’;
Добрый день! Частное решение понятно, спасибо. Вопрос в том, а не стоит ли предотвращать подобные коллизии с пересозданием виртуальных устройств при перезагрузке файла правил, путем, к примеру, блокировки кнопки “Сохранить” в редакторе правил на те же 10 секунд?
Тем более, что:
С точки зрения синтаксиса и здравого смысла исходная запись в rules.js корректна.
В ряде случаев лавина приводит к утрате работоспособности сервиса wb-rules в целом без самостоятельного восстановления работоспособности (требуется рестарт)