Сложение параметров и вывод в отдельный параметр

Доброго времени суток!

Есть 4 полной активной мощности с четырёх устройств. Необходимо сложить их и присвоить к новому параметру, которому можно будет назначить адрес и регистр в
“Шлюз MQTT - Modbus RTU/TCP slave” для чтения извне с WB.

Фото

image

Написал такое правило, но проблема в том, что не знаю как создать новый параметр для хранения суммы мощностей. Возможно и в коде мог накосячить.

Правило
// Определяем параметры, которые будем суммировать
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);
    }
});

Буду признателен за помощь, ибо по ключевым словам найти информацию не удалось. Возможно будет полезно также и для других.

Добрый день.

Не имеет большого смысла.

        var sum = value10 + value11 + value12 + value13;

Эквивалентно.

В документации: GitHub - wirenboard/wb-rules: Rule engine for Wiren Board

Например:

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});

Соответственно обращаться к контролу как

dev["SumDevice/sumValue"]

Согласен, моя ошибка, не оптимизированно как-то получилось.

Полагаю, что виртуальное устройство где-то должно быть объявлено? Но как и где?

За код большое спасибо!
Возникает вопрос касательно рациональности объявления нового виртуального устройства. Скорее всего я неправильно понял, ибо в моем случае виртуальный параметр создается каждый раз при активации правила, а не один раз с последующей проверкой и обновлением этого параметра. Не оптимизированно как-то получается.

Обновленное правило
// Определяем параметры, которые будем суммировать
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});

Проверка:

Вопрос с созданием виртуального устройства решил по данной публикации c GitHub
Конструктор виртуальных устройств (Virtual device) для контроллеров Wirenboard. С помощью кода решить не удалось, выдавало ошибку того, что нет такого устройства “undefined”, а где его объявить я не понимал.

С помощью конструктора создал устройство и параметр, к которому можно обращаться напрямую с правила

dev["Satec/Сумма мощностей"] = 12
Конструктор виртуальных устройств (Virtual device)