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);
}
}
После суточной проверки могу чуть более уверенно сказать, что память перестаёт жраться, если не использовать startTicker (в моём простейшем случае - ≈100 экземпляров раз в минуту присваивали значение “своему” dev).
За 36 часов после замены всех startTicker на setInterval утечки прекратились.
Сегодня сделаю тест с 100-200 работающих startTicker на 12-24 часа для полной уверенности. Версия с CRON, вроде, тоже память не ест, но внимательно не проверял.
UPD: А вот JSON.stringify(timers) выдаёт список таймеров, которых давно нет - т.е. после пересохранения файла скрипта эти таймеры не удаляются (в отличие от виртуальных устройств и правил)
Делал нечто похожее. Так и не понял, где косяк с видимостью переменных, но если разбить на 2 цикла - создание правила и запуск таймера, что-то там не срабатывает. Ну и “висят” экземпляры таймеров, которых уже давно нет в коде. Манипуляции со скриптами (сохранение, вкл-выкл) сбрасывают потребление памяти, но потом оно бодро возвращается к предыдущему.
Итого: пока обходной путь - не использовать startTicker, где возможно испольщование setInterval
var dev_name = "testTick";
var cells = {};
var count = 100;
for(var i=1;i<=count;i++) {
var s = "0000" + i;
s = s.substring(s.length-3,s.length);
cells["c_"+s] = { type: "value", readnonly: true, value: 0, forceDefault: true }
}
defineVirtualDevice(dev_name, { title: "Test Ticker", cells: cells });
var j=1;
var iv = setInterval(function() {
var s = "0000" + j;
s = s.substring(s.length-3,s.length);
log.debug('ticker: tmr_'+s);
defineRule("tick_"+s, {
when: function() { return timers["tmr_"+s].firing; },
then: function() {
var s0 = "c_"+s;
dev[dev_name][s0] = dev[dev_name][s0] + 1;
}
});
startTicker("tmr_"+s, 10000);
j++;
if (j > count) clearInterval(iv);
}, 10);
setTimeout(function(){
log.debug("Timers: "+JSON.stringify(timers));
}, 1000);