Добрый день! Возникла вполне ожидаемая потребность в определении моментов, когда по одному из каналов Modbus-устройства перестали поступать данные. По любой причине - отказ подключенного датчика, утрата связи с устройством, обрыв линии. Видел несколько топиков на портале на сравнимую тему от 2019 года. Может, появилось что-то новое в этой части для wb-rules?
Добрый день.
Реализовывал подобное с помощью создания виртуального устройства которое отслеживает изменения в топиках, что бы помечать отсутствие связи с устройством на SVG панели красным. Можете попросить ИИ сформировать под ваш запрос, вполне себе справляется с JS.
Использовал timeoutMs , ниже пример кода:
var deviceName = "virt_lux";
var timeoutMs = 5000; // 5 секунд без обновлений = потеря связи
var luxTimer = null;
defineVirtualDevice(deviceName, {
title: {
"en": "Virtual Lux",
"ru": "Виртуальный люкс"
},
cells: {
LUX_Value: {
title: {
"en": "LUX Value",
"ru": "Освещенность"
},
type: "value",
value: 0
},
Connection: {
title: {
"en": "Connection",
"ru": "Связь"
},
type: "switch",
value: false
}
}
});
defineRule("update_lux_value", {
whenChanged: "wb-ms_89/Illuminance", // укажите реальное имя устройства
then: function (newValue) {
if (newValue !== undefined && newValue !== null) {
dev[deviceName + "/LUX_Value"] = newValue;
dev[deviceName + "/Connection"] = true;
if (luxTimer) {
clearTimeout(luxTimer);
}
luxTimer = setTimeout(function () {
dev[deviceName + "/Connection"] = false;
}, timeoutMs);
}
}
});
Идея понятна, спасибо. Вопрос: в каких случаях в обработчик правила могут попадать вышеуказанные значения?
Этот способ косвенный и неэффективный, а есть способ прямой и эффективный.
Драйвер устанавливает …/meta/error при ошибках чтения, записи, и когда он не успевает опросить устройство за отведенное время.
Для работы с …/meta/error почитайте: GitHub - wirenboard/wb-rules: Rule engine for Wiren Board
В обработчик then(newValue, devName, cellName) могут приходить:
undefined
— если значение ещё не существует (устройство/контрол ещё не создан при старте);
— если контрол временно отсутствует (перезапуск драйвера, реконфигурация);
— если есть ошибка в имени контрола.
null
— если драйвер или правило явно опубликовали null;
— если устройство недоступно и значение сброшено;
— если вы сами присвоили null виртуальному контролу.
Добрый день.
Если у вас остались вопросы к тех поддержке - пишите, постараемся помочь.