EXT
31.Январь.2025 08:11:53
1
Всем привет!
Задача : Окрашивать текст на 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 в дальнейшем остается, и никак не реагирует на включение/отключение устройства. Что я делаю не так?
Добрый день!
Рекомендую проанализировать данные , поступающие в топики, и проверить, верно ли они приходят.
Также может быть полезна данная статья .
Существует ещё один способ реализации вашей задумки , подробнее описанный здесь .
EXT
31.Январь.2025 10:47:57
6
Aleksandr_Khlebnikov:
проанализировать данные
Через Настройки - Каналы MQTT, значение топика “Статус” меняется корректно, в зависимости от Включения/Отключения устройства. В канале виртуального устройства при этом изменений - 0.
NodeRed очень не хотелось бы использовать, уже построена определенная логика других устройств на wb-rules, нарисованы дашборды, и все прилично работает. Просто хотелось бы добавить индикацию того, что устройство “отвалилось”
Добрый день!
Рекомендую добавить отладочное логирование на каждое действие скрипта с отображением значения состояния нужного топика .
Добрый день, удалось ли решить вопрос?
EXT
03.Февраль.2025 12:04:19
9
Добрый, к сожалению - нет.
Пробовал и через 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 лайк
EXT
10.Март.2025 10:56:05
14
Благодарю что не забыли)
Попробую у себя воспроизвести
1 лайк
EXT
11.Март.2025 06:43:45
15
Здравствуйте!
Благодарю, вопрос решен.
1 лайк