Прототип добавления виртуальных устройств

Доброго времени суток.
Появилась необходимость добавить несколько виртуальных устройств. Хочу сделать 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 откатить можно.
Буду рад умным мыслям)

1 лайк

Так, ну собственно говоря добавляемые элемены - это объект.
Вот и работать с ним нужно как с объектом.
Распишу подробно-подробно как смогу, так чтобы даже я сам понял если бы мне так объясняли…
Объект в 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;
}

Результат:
Screenshot from 2020-11-25 22-05-56

1 лайк

Это знаем, испраивим. Но благодарю.

Добрый день.
Атрибут min я практически сразу починил:

“Sleeping Room”: {
type: “range”,
min: 20,
value: 25,
max: 50,
“Enabled”: {
type: “switch”,
value: false
}
}

Ошибка была в том, что забыл запятую после значения атрибута max.

Была такая бага, еще летом. Я и подумал - что опять сломалось.
Со сборкой объекта получилось?

Честно,еще не пробовал. На данный момент у меня реализовано через функцию-шаблон и ее вызов с разными параметрами. Информация полезна на будущее.