Создание виртуального устройства

Столкнулся с проблемой: не могу разобраться как работает функция defineVirtualDevice при попытке создать устройство с таким же ID.

Допустим, есть в файле код (файл хранится в папке для правил):

Спойлер

/------------------------------------------------------------------------
// Основное виртуальное устройство с контролами управления электропитанием
------------------------------------------------------------------------
/
defineVirtualDevice(“PowerControls”, {
title:“Управление электропитанием”,
cells: {
“InputEnable”: {
title: “Выключатель ввода”,
type:“switch”,
value: 1
},
“EmergencyOffPower”: {
title: “Аварийное отключение”,
type:“switch”,
value: 0
},
“VideoSystemEnable”: {
title: “Видеосистема”,
type:“switch”,
value: 0
},
“AllDisable”: {
title: “Полное отключение”,
type:“switch”,
value: 0
},
“MainEnable”: {
title: “Сеть и освещение в доме”,
type:“switch”,
value: 0
},
“BanyaEnable”: {
title: “Сеть и освещение в бане”,
type:“switch”,
value: 0
},
“AllowOffAction”: {
title: “Разрешить отключение АВ инвертора”,
type:“switch”,
value: 0
},
“AllLightOff”: {
title: “Выключить всё освещение”,
type:“pushbutton”,
value: 0
},
“ExtLightOff”: {
title: “Выключить внешнее освещение”,
type:“pushbutton”,
value: 0
},
“Ring”: {
title: “Звонок”,
type:“pushbutton”,
value: 0
},
“Reset”: {
title: “Сброс неисправностей”,
type:“pushbutton”,
value: 0
},
“Battery48VOFF”: {
title: “Аварийное отключение АКБ 48 В”,
type:“pushbutton”,
value: 0
},
“PV120VOFF”: {
title: “Аварийное отключение СБ 120 В”,
type:“pushbutton”,
value: 0
},
“AlarmInputNoPower”: {
title: “Ввод отключен/не в норме”,
type:“alarm”,
value: false
},
“AlarmInputQF”: {
title: “Авария вводных выключателей”,
type:“alarm”,
value: false
},
“AlarmOutputQF”: {
title: “Авария выключателей потребителей”,
type:“alarm”,
value: false
},
“AlarmSysError1”: {
title: “Общая ошибка”,
type:“alarm”,
value: false
},
“NumAlarms1”: {
title: “Неисправностей”,
type:“value”,
value: 0
},
“FanSetPoint”: {
title: “Уставка охлаждения ЩВУ”,
type:“value”,
value: 0,
units: “°C”
},

}

});

Сколько бы раз я не перезапускал движок правил после внесения правок в файл - всё норм работает. Даже после перезагрузки. (я так понимаю там сам движок перезапускается при сохранении файла).

Аналогично есть несколько файлов, где так же создаются виртуальные устройства и всё норм.

А вот при попытке создать виртуальное устройство из функции модуля (расположен в папке модулей пользователя):

Спойлер

exports.Init = function(ID, ControllerDirection, timeframe, ICounter, Kp, Ki, MinOutput, MaxOutput) {

// Создаем виртуальное устройство
log("Инициализация ПИД");

if (!dev[ID + "Control/Output"])
    defineVirtualDevice(ID + "Control", {
        title: ID + "PID",
        cells: {
			"Kp" : {
				type: "range",
				value: Kp,
				min: 1,
				max: 100,
            },
			"Ki" : {
                type: "range",
                value: Ki,
                min: 0,
                max: 100,
			},
			"MinOutput" : {
                type: "range",
                value: MinOutput,
                min: 0,
                max: 100,
			},
			"MaxOutput" : {
                type: "range",
                value: MaxOutput,
                min: 0,
                max: 100,
			},
			"Output" : {
                type: "value",
                value: 0
			}
		},
	});

var OBJ = new PID(ID, ControllerDirection, ICounter);

OBJ.setSampleTime(timeframe);

return OBJ;

};

столкнулся с тремя проблемами:

  1. При попытке просто создать устройство - ругается, что такое уже существует. Ок, можно списать на то, что при перезапуске правил он сверяет ВУ и переподключает их, а при динамическом управлении - нет.
  2. При попытке вызвать getDeviceId(ID + “Control”), getId(ID + “Control”) получаю ошибку скрипта ECMAScript error: ReferenceError: identifier ‘getDeviceId’ undefined, ECMAScript error: ReferenceError: identifier ‘getId’ undefined.
    Отсюда и такая своеобразная форма выяснить есть ли ВУ -
    if (!dev[ID + “Control/Output”]) (Output обычно 0 не бывает, во всяком случае тогда точно не был)
  3. Всё бы ничего и оно даже более менее работало, если бы не одно но: где-то через сутки работы значения с указанных контролов перестали передаваться в канал MQTT. Т.е. я кручу ползунок range, он меняется, а на странице - настройки - каналы … в канале с нужным ID как было вчерашнее значение контрола - так и осталось (и log(dev[‘…’]) так же выдавал старое).Само ВУ доступно на странице устройств в админке.

Я пока принудительно этими панипуляциями пересоздал ВУ и пока проблем нет, но посмотрим, когда ползунки отвалятся снова.

Не скажу, что ПОКА проблема для меня критична, ибо я перемещу потом настройки в конфиг. Но чувство, что работает оно явно не так, как задумано, или я что-то не так понял с функциями получения ID (а раз не знаю ид, то не могу и проверить существование контролов через api).

PS: на форуме нужны подписи и я кажется знаю, что туда напишу: версия 2404 stable.

Сам задал вопрос, сам и разобрался: примелькались getDevice() и getDeviceId(), отсюда и не работало по второму пункту. Остальное, похоже, ожидаемые поведения.

1 лайк