Отслеживание статуса устройства

Всем привет!
Задача : Окрашивать текст на SVG панели, в зависимости от состояния устройства (подключено или отвалилось).

С SVG все понятно, не получается корректно отследить статус. В примерах дернул код и немного подправил для себя.

defineVirtualDevice("meta3", {
  title: "Metaerordisplay",
  cells: {
      topic: {
      type: "text",
      value: "",
      readonly: true
    },
    value: {
      type: "text",
      value: "",
      readonly: true
    },
  }
});

 
trackMqtt("/devices/wb-modbus-0-0/controls/L1 - Напряжение/meta/error", function(message){
  log.info("name: {}, value: {}".format(message.topic, message.value))
  if (message.value== "r"){
    dev["meta3/value"] = message.value;
    } else {
    dev["meta3/value"] = 1;
  }
  
});

Создается виртуальное устройство нормально :

Выключаю устройство которое необходимо контролить

И на этом все! Значение r в дальнейшем остается, и никак не реагирует на включение/отключение устройства. Что я делаю не так?

Добрый день!

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

Также может быть полезна данная статья.

Существует ещё один способ реализации вашей задумки, подробнее описанный здесь.

Через Настройки - Каналы MQTT, значение топика “Статус” меняется корректно, в зависимости от Включения/Отключения устройства. В канале виртуального устройства при этом изменений - 0.

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

Добрый день!

Рекомендую добавить отладочное логирование на каждое действие скрипта с отображением значения состояния нужного топика.

Добрый день, удалось ли решить вопрос?

Добрый, к сожалению - нет.
Пробовал и через TrackMqtt, и через whenChanged напрямую читать meta/error, результат один - канал виртуального устройства один раз срабатывает при отключении контролируемого устройства, пишется значение r, и на этом все. Дальше реакции - ноль. Не реагирует на включение/выключение контролируемого устройства, как стоит значение r так и остаётся. Даже если пересоздать виртуальное устройство, все равно висит значение r. Контроллер WirenBoard 8.4 , стоит самый крайний тест релиз, если это как - то поможет)

Добрый день!

Попробую воспроизвести, возможно, удастся решить проблему.

1 лайк

Здравствуйте!

Получилось что нибудь?

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

Добрый день!

Приношу извинения за задержку с ответом.

Вот пример правила, которое решает вашу задачу:

var DEVICE_NAME = "wb-ms_90";
var CHECK_INTERVAL = 5; // Проверяем раз в 5 секунд
var lastUpdateTime = new Date().getTime();
var errorFlag = false; // Флаг ошибки

// Создаём виртуальное устройство
defineVirtualDevice("wb-ms_90_status", {
    title: "Мониторинг wb-ms_90 (Температура)",
    cells: {
        Online: {
            type: "switch",
            value: false
        },
        Error: {
            type: "text",
            value: "OK"
        }
    }
});

// Подписка на изменение температуры
trackMqtt("/devices/" + DEVICE_NAME + "/controls/Temperature", function (message) {
    lastUpdateTime = new Date().getTime();
    dev["wb-ms_90_status"]["Online"] = true;
    dev["wb-ms_90_status"]["Error"] = "OK"; // Сбрасываем ошибку
});

// Подписка на ошибки температуры
trackMqtt("/devices/" + DEVICE_NAME + "/controls/Temperature/meta/error", function (message) {
    if (message.value.trim() === "r") {
        log("[ERROR] Ошибка температуры wb-ms_90!");
        errorFlag = true;
        dev["wb-ms_90_status"]["Error"] = "Ошибка температуры!";
    } else {
        errorFlag = false;
        dev["wb-ms_90_status"]["Error"] = "OK";
    }
});

// Проверка доступности устройства
defineRule("check_device_presence", {
    when: cron("@every " + CHECK_INTERVAL + "s"),
    then: function () {
        var currentTime = new Date().getTime();
        if (currentTime - lastUpdateTime > CHECK_INTERVAL * 1000) {
            dev["wb-ms_90_status"]["Online"] = false;
            log("[ERROR] Устройство " + DEVICE_NAME + " НЕ отвечает!");
        } else {
            log("[INFO] Устройство " + DEVICE_NAME + " в сети.");
        }

        if (errorFlag) {
            log("[WARNING] Устройство " + DEVICE_NAME + " на связи, но есть ошибка температуры!");
        }
    }
});

Необходимо только заменить на нужные топики и поменять названия ошибок.

1 лайк

Благодарю что не забыли)
Попробую у себя воспроизвести

1 лайк

Здравствуйте!
Благодарю, вопрос решен.

1 лайк