Здравствуйте.
Пишу правило, в котором виртуальное устройство будет создаваться функцией по заданным мной параметрам:
Собственно правило:
var aQuantity = 5;
var devsA = [];
makeABCVirtualControl(aQuantity);
function makeABCVirtualControl(adresses) {
if (getDevice("ABC") === undefined) {
defineVirtualDevice("ABC", {
title: "ABC",
cells: {},
})
}
var lastOrder = 0;
for (var i = (lastOrder + 1); i <= (lastOrder + adresses); i++) {
var newCtrlName = "A" + i + "ch";
if (!getDevice("ABC").isControlExists(newCtrlName)) {
getDevice("ABC").addControl(newCtrlName, {
order: i,
type: "range",
value: 0,
max: 254,
readonly: false
});
}
}
lastOrder = lastOrder + adresses;
for (var i = (lastOrder + 1); i <= (lastOrder + adresses); i++) {
var newCtrlName = "A" + (i - lastOrder) + "fb";
if (!getDevice("ABC").isControlExists(newCtrlName)) {
getDevice("ABC").addControl(newCtrlName, {
order: i,
type: "value",
value: 0,
readonly: true
});
}
}
log.info(getDevice("ABC").isVirtual());
getDevice("ABC").controlsList().forEach(function (ctrl) {
if (ctrl.__cellId.indexOf("A") > -1 && ctrl.__cellId.indexOf("ch") > -1) {
devsA.push(ctrl.__deviceId + "/" + ctrl.__cellId);
}
});
log.info("devsA: {};".format(devsA));
}
defineRule("test1", {
whenChanged: devsA,
then: function (newValue, devName, cellName) {
log.info("newValue: {}; devName: {}; cellName: {};".format(newValue, devName, cellName));
}
});
var temp = 0;
defineRule("test2", {
when: cron("@every 5s"),
then: function () {
if(temp < 254) temp++; else temp = 0;
dev["ABC/A1fb"] = temp;
}
});
Все работает, но иногда, после сохранения правила, проверка на “виртуальность” (isVirtual()) выдает “false”, соответственно при попытке записать значение в контрол появляется ошибка:
wb-rules[1828]: ERROR: control ABC/A1fb SetValue() error: This control is not writable
Если удалить устройство из web-интерфейса и пересохранить правило, все начинает правильно работать (isVirtual выдает “true” и значения отображаются).
Что я упустил?