Доброго времени суток.
Появилась необходимость добавить несколько виртуальных устройств. Хочу сделать 1 прототип функции с аргументами, а далее вызовы.
Собственно не получается передать аргумент в атрибут cell.
function heaterControl(virtDevName, titleName, roomName)
{
defineVirtualDevice(virtDevName,
{
title: titleName,
cells: {
[roomName]: { // вот тут проблема
type: “range”,
value: 25,
max: 50
},
enabled: {
type: “switch”,
value: false
}
})
}
heaterControl(“Floor_Temp”, “Floor Temperature”, “Child 1”);
И еще. У типа range не работает атрибут min. Все равно ползунок до 0 откатить можно.
Буду рад умным мыслям)
Так, ну собственно говоря добавляемые элемены - это объект.
Вот и работать с ним нужно как с объектом.
Распишу подробно-подробно как смогу, так чтобы даже я сам понял если бы мне так объясняли…
Объект в JS - это вообще все. В него можно и функцию записать и значение. И функцию которое допишет в него значение, создав новый элемент…
Сделаем скрипт:
//11_25_test_3.js
//'use strict';
var boxname = "test1"; // CHANGE_ME! имя устройства. Выводится в заголовок окна и служит для разделения устройств
log.info("TestScript_"+boxname+"START######################"); //Это лог.
//Элементы виртуального устройства
var deviceCells = {
"TextCell1": {
type: "text",
readonly: false,
value: "0"
},
};
//Создадим виртуальное устройство и добавим в него элементы
defineVirtualDevice("device_"+boxname, {
title:"Device "+boxname,
cells: deviceCells
});
//log.info("deviceCells =",deviceCells);
log.info(objEXAM(deviceCells));
log.info(objEXAM(deviceCells.TextCell1));
function objEXAM (object) {
log("objEXAM enter");
var strout = "";
for (var xobj in object) {
log("objEXAM", xobj);
if (object.hasOwnProperty(xobj)) {
strout += xobj + "::" + object[xobj] + " ";
}
else{
log(xobj, "noProperty");
}
}
return strout;
}
и сохраним-запустим.
Наблюдаем вывод:
2020-11-25 20:41:02TestScript_test1START######################
2020-11-25 20:41:02objEXAM enter
2020-11-25 20:41:02objEXAM TextCell1
2020-11-25 20:41:02TextCell1::[object Object]
2020-11-25 20:41:02objEXAM enter
2020-11-25 20:41:03objEXAM type
2020-11-25 20:41:03objEXAM readonly
2020-11-25 20:41:03objEXAM value
2020-11-25 20:41:03type::text readonly::false value::0
из которого понятно что deviceCells - это объект.
И он содержит в сете еще один объект TextCell1
У которого уже есть свойства type::text readonly::false value::0
Отлично? Да. Теперь как это “собрать”?
Делаем новый скрипт:
//11_25_test_5.js
//'use strict';
boxname = "test5";
log.info("################",boxname);
objnew2 = "TextCell1"; //Поименуем tot объект
nameOfProperty="type"
valueOfProperty="kva-kva kva-kva"
objMain= {}; //Создаем объект
objMain[objnew2] = {}; //вложенный объект. Имя передаем переменной
//objMain[objnew2] = new Object(); //Так тоже можно создать объект
objMain[objnew2][nameOfProperty] = "text"; // добавляем свойства. Имя - тоже можно переменной
objMain[objnew2]["readonly"] = false; //Или константой
objMain[objnew2]["value"]=valueOfProperty; //И значение - можно переменной.
log.info(objEXAM(["objMain"]));
log.info(objEXAM(["objMain"].TextCell1));
//delete objnew1Main;
//Создадим виртуальное устройство и добавим в него элементы
defineVirtualDevice("device1_"+boxname, {
title:"Device1 "+boxname,
cells: objMain
});
function objEXAM (object) {
log("objEXAM enter");
var strout = "";
for (var xobj in object) {
log("objEXAM", xobj);
if (object.hasOwnProperty(xobj)) {
strout += xobj + "::" + object[xobj] + " ";
}
else{
log(xobj, "noProperty");
}
}
return strout;
}