Есть 4 полной активной мощности с четырёх устройств. Необходимо сложить их и присвоить к новому параметру, которому можно будет назначить адрес и регистр в
“Шлюз MQTT - Modbus RTU/TCP slave” для чтения извне с WB.
Написал такое правило, но проблема в том, что не знаю как создать новый параметр для хранения суммы мощностей. Возможно и в коде мог накосячить.
Правило
// Определяем параметры, которые будем суммировать
var satec10 = "wb-modbus-11-0/[ШР-А] ΣPa";
var satec11 = "wb-modbus-11-1/[ШР-В] ΣPa";
var satec20 = "wb-modbus-11-2/[ШР-К-А] ΣPa";
var satec21 = " wb-modbus-11-3/[ШР-К-В] ΣPa";
// Определяем параметр, в который будем записывать результат
var satecs = "wb-modbus-11-4/[Сумма] ΣPa";
// Правило, которое срабатывает при изменении любого из исходных параметров
defineRule({
whenChanged: [satec10, satec11, satec20, satec21],
then: function (newValue, devName, cellName) {
// Получаем текущие значения параметров
var value10 = dev[satec10];
var value11 = dev[satec11];
var value12 = dev[satec12];
var value13 = dev[satec13];
// Суммируем значения
var sum = value10 + value11 + value12 + value13;
// Записываем результат в пятый параметр
dev[satecs] = sum;
// Логируем результат (опционально)
log("Сумма значений: " + sum);
}
});
Буду признателен за помощь, ибо по ключевым словам найти информацию не удалось. Возможно будет полезно также и для других.
function makeNewVirtualControl(vdName, nameControl, typeControl){
//log.info("GetDevice", getDevice("vdName"))
if (getDevice(vdName) === undefined) {
log.info("Define new")
defineVirtualDevice(vdName, {
title: vdName,
cells: {},
})
}
//Тут проверим есть ли уже контрол и если нет - создадим.
if (!getDevice(vdName).isControlExists(nameControl)) {
log.debug("Контрола "+nameControl+" нет, создаем.")
getDevice(vdName).addControl(nameControl, typeControl);
}
}
makeNewVirtualControl("SumDevice", "sumValue", {type: "value", value: "0", readonly: true});
Согласен, моя ошибка, не оптимизированно как-то получилось.
Полагаю, что виртуальное устройство где-то должно быть объявлено? Но как и где?
За код большое спасибо!
Возникает вопрос касательно рациональности объявления нового виртуального устройства. Скорее всего я неправильно понял, ибо в моем случае виртуальный параметр создается каждый раз при активации правила, а не один раз с последующей проверкой и обновлением этого параметра. Не оптимизированно как-то получается.
Обновленное правило
// Определяем параметры, которые будем суммировать
var satec10 = "wb-modbus-11-0/[ШР-А] ΣPa";
var satec11 = "wb-modbus-11-1/[ШР-В] ΣPa";
var satec20 = "wb-modbus-11-2/[ШР-К-А] ΣPa";
var satec21 = "wb-modbus-11-3/[ШР-К-В] ΣPa";
// Правило, которое срабатывает при изменении любого из исходных параметров
defineRule({
whenChanged: [satec10, satec11, satec20, satec21],
then: function (newValue, devName, cellName) {
// Суммируем значения
var sum = dev[satec10] + dev[satec11] + dev[satec20] + dev[satec21];
// Записываем результат в пятый параметр
dev["SumDevice/[ШР-Сумма] ΣPa"] = sum;
// Логируем результат (опционально)
log("Сумма значений: " + sum);
}
});
function makeNewVirtualControl(vdName, nameControl, typeControl){
log.info("GetDevice", getDevice("vdName"))
if (getDevice(vdName) === undefined) {
log.info("Define new")
defineVirtualDevice(vdName, {
title: vdName,
cells: {},
})
}
//Тут проверим есть ли уже контрол и если нет - создадим.
if (!getDevice(vdName).isControlExists(nameControl)) {
log.debug("Контрола "+nameControl+" нет, создаем.")
getDevice(vdName).addControl(nameControl, typeControl);
}
}
makeNewVirtualControl("SumDevice", "[ШР-Сумма] ΣPa", {type: "value", value: "0", readonly: true});