Mqtt после перезагрузки на HA

После отключения питания WB 8, после загрузки в HA не доступны устройства по mqtt. Вновь становятся доступны устройства когда нажимаешь записать . См. Фото.
Подскажите как сделать так что бы после перезагрузки все было в автономном режиме. Загрузилось и сразу доступно.



Хотя мониторинг температуры работают сразу

Добрый день!

wb-engine не является нашим продуктом, поэтому, к сожалению, мы не можем компетентно помочь с данной проблемой.

Рекомендую ознакомиться с материалами и задать вопросы напрямую в теме автора скрипта.

Ну как минимум вы знаете об этой проблеме, было про это тут: Проблема с порядком запуска wb-rules и wb-mqtt-serial

@xonter как решение включите persistence в mosquitto

1 лайк

Знаем. И, в ПО контроллера подобное поведение считаем багом, который исправляется срочно: Шлюз MQTT - OPC UA - #8 от пользователя BrainRoot
Потому что зависимсти от наличия/отсутствия топика на момент старта не должно быть.

Это не очень хорошее решение, потенциально может привести к разрастанию БД и падению брокера.

Какое именно поведение вы считаете багом? Планируете ли вы сделать загрузку wb-rules после остальных сервисов?

Неспособность сервиса взаимодействовать с топиками, которые в нем, в сервисе сконфигурированы но (временно) отсутствуют.

А для чего это делать, то есть настроить сервис таким образом можно - но какую задачу это решит?

Конкретно мой сервис (wb-engine) про который речь, срабатывает РАЗОВО только при старте wb-rules и это решило бы проблему с которой сталкиваются регулярно пользователи при перезагрузке устройства.

// Перезапуск wb-engine через 60 секунд после старта
defineRule(‘restart_wb_engine_after_boot’, {
whenChanged: ‘wb-mqtt-metrics/uptime’,
then: function (newValue, devName, cellName) {
if (newValue > 0 && newValue < 2) {
setTimeout(function () {
runShellCommand(‘systemctl restart wb-engine.service’);
}, 60 * 1000); // 60 секунд
}
}
});

В порядке бреда предлагаю такое решение. Что скажете?

Вы открыто заявляете о поддержке своих устройств в HA sprut и т д.
Почему доделать то не можете полноценно? Какое решение в итоге? Делать что? Выкинуть контроллер клиенту у кон ого свет может по несколько раз за неделю отключаться?

Интеграция с HA описана в статье.
Работает годами.
Так что - вполне надежное, проверенное решение.
Интеграторы обычно так и делают.
Я думаю что оптимально - настроить интергацию как описано.

Пожалуйста, выскажите своё мнение насчёт скрипта

// Перезапуск wb-engine через 60 секунд после старта

defineRule(‘restart_wb_engine_after_boot’, {
  whenChanged: ‘wb-mqtt-metrics/uptime’,
    then: function (newValue, devName, cellName) {
      if (newValue > 0 && newValue < 2) {
        setTimeout(function () {
        runShellCommand(‘systemctl restart wb-engine.service’);
        }, 60 * 1000); // 60 секунд
      }
    }
  });

Чревато ли его внедрение какими-либо последствиями?

Нужно делать перезапуск сервиса wb-rules.

Можно пойти через системный crontab, например так:

@reboot sleep 60 && systemctl restart wb-rules

@xonter попробуйте такой вариант

Не факт что когда wb-rules запустится uptime будет 1. Даже скорее наоборот.

defineRule(‘restart_wb_rules_after_boot’, {
  whenChanged: ‘system/Current uptime’,
    then: function (newValue, devName, cellName) {
      if (newValue > 180 && newValue < 182) {
        setTimeout(function () {
        runShellCommand(‘systemctl restart wb-rules’);
        }, 60 * 1000); // 60 секунд
      }
    }
  });

Предлагаю перезапуск спустя 3 минуты тогда. Отстроить можно под себя, если по каким-то причинам запуск идёт дольше конкретно в вашем случае.

Можем фиксировать этот ответ как решение? К сожалению сейчас нет возможности проверить, поэтому руководствуюсь только логикой

1 лайк

Добрый день!

Чуть подправил код. Но надёжнее прописывать интеграцию напрямую в Home Assistant, минуя дополнительную точку отказа. Чем меньше рабочих узлов в системе — тем она стабильнее.

var alreadyRestarted = false;

defineRule('restart_wb_rules_after_boot', {
  whenChanged: 'system/Current uptime',
  then: function (newValue, devName, cellName) {
    var uptime = parseFloat(newValue);
    if (!alreadyRestarted && uptime > 180) {
      alreadyRestarted = true;
      setTimeout(function () {
        runShellCommand('systemctl restart wb-rules');
      }, 60 * 1000); // через 60 секунд
    }
  }
});

Спасибо большое за исправления!

Подскажите, а при перезагрузке wb-rules у нас разве не сбросит состояние переменная, которую мы создали в WB rules? Про alreadyRestarted речь

Надо потестировать, по идее нет.

Вы можете инструкцию написать что куда и как писать? Я ещё в этой теме плаваю но могу потестировать.

Добрый день,
Рекомендую начать с данной статьи.

А конкретнее?