Ошибка, если устройство не найдено

День добрый!
Читал тему Отложенный запуск Wb-rules, но решения так и не нашел, ввиду того что правило не совсем такое как в примере.
Поясню.
Есть датчик температуры 18B20, подключен на W1.
Ну и правило, которое шлет смс.
WB-V-KС-HOLOD1-1_new.js (9,5 КБ)
wb-rules_20240126T123309.log (54,8 КБ)

При перезагрузке правило не работает, в логе ошибка.

Ошибка
26-01-2024 12:33:09.258 [wb-rules] WARNING: couldn’t load /etc/wb-rules/WB-V-KС-HOLOD1-1_new.js: TypeError: invalid base value
duk_hobject_props.c:2000
anon /etc/wb-rules/WB-V-KС-HOLOD1-1_new.js:51 preventsyield
forEach native strict preventsyield
F /etc/wb-rules/WB-V-KС-HOLOD1-1_new.js:217 preventsyield
26-01-2024 12:33:09.235 [wb-rules] ERROR: [rule error] Error in getting device: Device with given ID doesn’t exis

Вызвано это тем, что сначала загружается служба правил и загружается сами правила, а затем датчики.
Тут загружается мое правило
26-01-2024 12:33:09.187 [wb-rules] WARNING: [rule warning] Создаем виртуальный девайс ХОЛОДИЛЬНИК МИЦЕЛИЙ

А тут загружается служба 1-Wire
26-01-2024 12:33:22.028 [init.scope] Started Kernel 1-Wire MQTT driver for WB-HomA.

Соответственно служба ругается на получение данных с несуществующего устройства:
getDevice(wb-w1).isControlExists(28-01144eeae0aa)

Код

Строка 51:
if (getDevice(“” + (vd[1]).match(/[^/]/) + “”).isControlExists(“” + (vd[1]).match(/[^/]$/) + “”)){
getControl(vkont + “/” + vd[0]).setValue(getControl(vd[1]).getValue()); //Установка текущих значений

Которое появится только через 12 секунд.

Как корректно решить данную задачу?

  1. писать SetTimeout вокруг каждого правила?
  2. Переносить запуск правил в конец? (а если это устройство вообще никогда не появится после перезапуска? мож оно умерло или кабель перебит. Все? все остальное к черту?)
  3. Переписать функцию получения данных с устройства, и если устройство не найдено - выдавать информацию.
    Есть такая возможность?

Для “ответственых” датчиков типичным подходом является еще и периодический контроль их наличия с обработкой отсутствия, естественно.
Вот как тут: Сообщение при отключении или неисправности в Telegram - #3 от пользователя BrainRoot
К сожалению не могу посмотреть в ваш скрипт, так как js запрещен на форуме.
Выложите сам текст его отформатировав как код.
И да, я бы начинал (активировал правило) после таймаута в 30, например секунд после старта контроллера.
Но, хочу заметить что использование в правилах отсутствующих в текущий момент, при его создании контролов - к ошибкам не приводит.

Читать топики meta/error я научился.
Но это уже когда датчики отваливаются в процессе работы.
Мне надо прочитать датчик, который еще не существует в системе, но будет существовать позднее.
Архив со скриптом.
WB-V-KС-HOLOD1-1_new.zip (9,7 КБ)

Моделируем ситуацию.
Отключается ЭЭ, и часть датчиков, например, физически отключается (трактор перекопал траншею с кабелями).
Включается контроллер и он перестает работать вообще, даже с существующими датчиками.
Что делать?

А тут я (обычно) контролирую наличие и отсутствие ошибок на всех перечисленных списком
Реализовано просто, именно отдельным скриптом в котором логика:
создается правило, подписывающееся на uptime контроллера.
Внутри правила:

  • сравниваем значение с двумя минутами - если больше - отключаем правило. На случай перезапуска wb-rules уже после запуска контроллера.
    *сравниваем с минутой. Если больше проверяем наличие (описанных тупым списком) топиков и их ошибок. Если чего-то нету или ошибка - отправляем сообщение. Отключаем правило.

Костыли какие-то.
Есть же штатная проверка существования контрола getDevice().isControlExists(). Зачем еще городить что-то? В чем проблема выводить “-1” в случае отсутствия устройства вообще, вместо ошибки. Можно ли эту функцию в bugreport отправить для включения в работу?
Скиньте ваш скрипт, может что-то придумаю.
Спасибо)

Пример:

//01_26_test_02.js

var vdName = "system";
var nameControl = "Current uptime";

log.info("проверим контрол");

if (!getDevice(vdName).isControlExists(nameControl)) {
  log.info("Контрола "+nameControl+" нет, создаем")
  //getDevice(vdName).addControl(nameControl, typeControl);
} else {
  log.info("Контрол "+nameControl+" есть.")
}

И пример работает возврашает истину если контрол есть.
Ошибка у вас в 51 строке - потому что нет самого устройства, которому он принадлежит.
И да, наверно сделаю про это запрос разрабочикам - добавить функцию наличия самого устройства.

Да стыдно показывать как есть, приведу в порядок - покажу.

Да стыдно показывать как есть, приведу в порядок - покажу.

Ниче не стыдно) Значит есть куда расти. Кидайте.
С другой стороны как еще это можно проверить?
Когда можно ждать от разработчиков результат?

Кстати,
Мой скрипт невозможно редактировать в web-редакторе по причине ошибки:

File path should contains only digits, letters, whitespaces, ‘_’ and ‘-’ chars

тоже намекает, что надо поправить работу.

Ну, причешу все ж.

Да, символ “С” русский

Кстати, такая проблема проявляется на прошивке 2401.
На прошивке 2207 и 2304 такой проблемы нет.
На 2401 отваливается на 52 строке.
На других скрипт отрабатывает и отправляет в лог сообщение WARNING: [rule warning] valueoldValue: error. Ошибка получения данных с устройства: null которое у меня в 73 строке. Т.е. отрабатывает корректно.

Скрипт

var switcholdValue = []; // переменная предыдущих значений
var valueoldValue = []; // переменная предыдущих значений
var smstmout = 300; //Задержка отправки смс в сек.
var checktmout = 10; //Задержка проверки доступности датчиков в сек.
var valinf = []; // Переменная установки статусов датчиков value
var switchinf = []; // Переменная установки статусов датчиков switch

var vkont = “ХОЛОДИЛЬНИК МИЦЕЛИЙ”;

// Имя вирт данных, реальный контрол устройства, тип, значение, рабочее значение(true/false) для “switch”, min; max для пределов значений показаний устройства, единицы измерения
var vdata = [
[“Температура в Холодильнике Мицелия”, “wb-w1/28-01144eeae0aa”,“value”,0, false, 0, 4.2, “°C”],

];
log.warning ("Создаем виртуальный девайс " + vkont);
defineVirtualDevice(vkont, { // Создаем виртуальный девайс
title: vkont,
cells: {
“marked”: {
type: “text”,
readonly: true,
value: “1”
},
},
});

vdata.forEach(function(vd, numarr) {

getDevice(vkont).addControl(vd[0], {
        type: vd[2],
        value: vd[3],
    });
if (/Мицели*/.test(vd[0]) || /^Авария*/.test(vd[0]) || /^Газовый*/.test(vd[0])){
	if (vd[2] == "value"){
	getDevice(vkont).addControl("workvalue_" + vd[0], {
		type: "value",
		value: 0,
	});
	};	
	
	if (vd[2] == "switch"){
	getDevice(vkont).addControl("workvalue_" + vd[0], {
		type: "switch",
		readonly: true,
		value: vd[4],
	});
	};
	
};

if (getDevice("" + (vd[1]).match(/[^/]*/) + "").isControlExists("" + (vd[1]).match(/[^/]*$/) + "")){
		getControl(vkont + "/" + vd[0]).setValue(getControl(vd[1]).getValue()); //Установка текущих значений 
} else {
valinf[numarr]  = "error";
};	

setInterval(function(){ //проверка существования контрола
	if (getDevice("" + (vd[1]).match(/[^/]*/) + "").isControlExists("" + (vd[1]).match(/[^/]*$/) + "")){

						if (getControl(vd[1]).getError() != ""){
							
							valinf[numarr]  = "nodata";
							//valueoldValue[numarr] = valinf[numarr] ;
							log.warning  ("valueoldValue: " + valinf[numarr]  + ". Ошибка получения данных с устройства: " + dev[vkont + "/" + vd[1]]);
							
							dev[vkont + "/" + vd[0]] = -100;
							dev[vkont + "/" + "workvalue_" + vd[0]] = -100;
						};
						
					} else {
						
						valinf[numarr]  = "error";
						log.warning  ("valueoldValue: " + valinf[numarr]  + ". Ошибка получения данных с устройства: " + dev[vkont + "/" + vd[1]]);
						//valueoldValue[numarr] = valinf[numarr] ;
						
						dev[vkont + "/" + vd[0]] = -200;
						dev[vkont + "/" + "workvalue_" + vd[0]] = -200;
					};

}, checktmout * 1000);

setInterval(function(){ //Отправка смс
	
	if ((valueoldValue[numarr] == "nodata" || valueoldValue[numarr] == "error") && valinf[numarr]  == "normal"){
										global.__proto__.numto.forEach(function(num) {
											Notify.sendSMS(num, vkont + ". Восстановлена работа датчика " + vd[0] + ": " + dev[vkont + "/" + vd[0]] + " " + vd[7] + "! (" + global.__proto__.gmtdate + ")");
										});
										valueoldValue[numarr] = "normal";
	};
	if (valueoldValue[numarr] != "normal" && valinf[numarr]  == "normal"){
										global.__proto__.numto.forEach(function(num) {
											Notify.sendSMS(num, vkont + ". " + vd[0] + " в пределах нормы: " + dev[vkont + "/" + vd[0]] + " " + vd[7] + "! (" + global.__proto__.gmtdate + ")");
										});
										valueoldValue[numarr] = "normal"; 
	};
	if (valinf[numarr]  == "min"){
										global.__proto__.numto.forEach(function(num) {
											log.debug  (vkont + ". " + vd[0] + " меньше " + vd[5] + " " + vd[7] + ": " + dev[vkont + "/" + vd[0]] + "!");
											Notify.sendSMS(num, vkont + ". " + vd[0] + " меньше " + vd[5] + ": " + dev[vkont + "/" + vd[0]] + "  " + vd[7] + "! (" + global.__proto__.gmtdate + ")"); 
										});
										valueoldValue[numarr] = "min";
	};	
	if (valinf[numarr]  == "max"){
										global.__proto__.numto.forEach(function(num) {
											log.debug  (vkont + ". " + vd[0] + " больше " + vd[6] + " " + vd[7] + ": " + dev[vkont + "/" + vd[0]] + "!");
											Notify.sendSMS(num, vkont + ". " + vd[0] + " больше " + vd[6] + ": " + dev[vkont + "/" + vd[0]] + " " + vd[7] + "! (" + global.__proto__.gmtdate + ")"); 
										});
										valueoldValue[numarr] = "max";
	};	
	if (valinf[numarr]  == "nodata"){										
										global.__proto__.numto.forEach(function(num) {
											log.warning  (vkont + ". Нет информации от датчика " + vd[0] + ": более " + (smstmout / 60) + " минут! (" + global.__proto__.gmtdate + ")");	
											{Notify.sendSMS(num, vkont + ". Нет информации от датчика " + vd[0] + ": более " + (smstmout / 60) + " минут! (" + global.__proto__.gmtdate + ")");};
										});
										valueoldValue[numarr] = "nodata";
	};	
	if (valinf[numarr]  == "error"){										
										log.warning  (vkont + ". Не подключен или поврежден датчик " + vd[0] + "! (" + global.__proto__.gmtdate + ")");
										global.__proto__.numto.forEach(function(num) {
											Notify.sendSMS(num, vkont + ". Не подключен или поврежден датчик " + vd[0] + "! (" + global.__proto__.gmtdate + ")");
										});
										valueoldValue[numarr] = "error";
	};	
	if (switchinf[numarr] == "avar"){	
										global.__proto__.numto.forEach(function(num) {
											log.debug  (vkont + ". " + vd[0] + "!");
											Notify.sendSMS(num, vkont + ". " + vd[0] + "! (" + global.__proto__.gmtdate + ")"); 
										});
										switcholdValue[numarr] = "avar";

	};	
	if (switchinf[numarr] == "normal"){	
										global.__proto__.numto.forEach(function(num) {
											log.debug  ( vkont + ". Устранена " + vd[0] + "!");
											Notify.sendSMS(num, vkont + ". Устранена " + vd[0] + "! (" + global.__proto__.gmtdate + ")"); 
										});
										switcholdValue[numarr] = "normal";
	};
}, smstmout * 1000);

if (vd[2] == "value"){	
			defineRule(vd[0], { 
				whenChanged: vd[1],
				then: function(newValue, devName, cellName) { 
					
					if (getDevice("" + (vd[1]).match(/[^/]*/) + "").isControlExists("" + (vd[1]).match(/[^/]*$/) + "")){

						if (getControl(vd[1]).getError() == ""){

							getControl(vkont + "/" + vd[0]).setValue(getControl(vd[1]).getValue()); //Установка текущих значений 
							getControl(vkont + "/" + "workvalue_" + vd[0]).setValue(getControl(vd[1]).getValue()); //Установка текущих значений
									
							if (dev[vkont + "/" + vd[0]] < vd[5]){
								
								valinf[numarr] = "min";
								//valueoldValue[numarr] = valinf;
								log.warning  ("valueoldValue: " + valinf[numarr] + ". Температура: " + dev[vkont + "/" + vd[0]]);
							};
							if (dev[vkont + "/" + vd[0]] > vd[6]){

								valinf[numarr] = "max";
								//valueoldValue[numarr] = valinf;
								log.warning  ("valueoldValue: " + valinf[numarr] + ". Температура: " + dev[vkont + "/" + vd[0]]);
							};
							if (dev[vkont + "/" + vd[0]] < vd[6] && dev[vkont + "/" + vd[0]] > vd[5]){		
							
								valinf[numarr] = "normal";
								//valueoldValue[numarr] = valinf;
								//log.warning  ("valueoldValue: " + valinf[numarr] + ". Температура: " + dev[vkont + "/" + vd[0]]);
							
							};
						};
					
					};

			}});
};
	
	
if (vd[2] == "switch" ){
		getDevice(vkont).getControl(vd[0]).setReadonly(true);
		switcholdValue[numarr] = 	getControl(vd[1]).getValue(); //Установка старого(текущего) значения 
		
			defineRule(vd[0]+1, {
				asSoonAs: function () {
				return dev[vd[1]];
				},
				then: function (newValue, devName, cellName) {	
								dev[vkont + "/" + vd[0]] = dev[vd[1]];	
								//setTimeout(function () {
										if (dev[vkont + "/" + vd[0]] != vd[4] && dev[vkont + "/" + vd[0]] != switcholdValue[numarr]){
											
											switchinf = "avar";
											switcholdValue[numarr] =  newValue; //Установка нового(текущего) значения
											
										};
								//}, smstmout * 1000);
				}});
			
			defineRule(vd[0]+2, {
				asSoonAs: function () {
				return !dev[vd[1]];
				},
				then: function (newValue, devName, cellName) {	
								dev[vkont + "/" + vd[0]] = dev[vd[1]];	
								//setTimeout(function () {
										if (dev[vkont + "/" + vd[0]] != vd[4] && dev[vkont + "/" + vd[0]] != switcholdValue[numarr]){
											
											switchinf = "normal";
											switcholdValue[numarr] =  newValue; //Установка нового(текущего) значения
											
										};
								//}, smstmout * 1000);
				}});
									
	};

});

Дополню.
Обновил контроллер, который был на 2207, до 2401. На нем ошибка не проявляется.

Разница в этих контроллерах заключается в Ревизии железа.
На контроллере с ревизией 7.3.3E/3 669/1 отрабатывает корректно.
На контроллере с ревизией 7.3.2A/2 637 отрабатывает с ошибкой в 52 строке.

Не подтвердилось. Воспроизводится везде, пока Лог не выдаст сообщение:

INFO: all rule files are loaded

В любом случае доработал скрипт, который отлавливает ошибку и пытается несколько раз подключить устройство, если оно сейчас не найдено в течение установленного времени. При этом скрипт не падает, а другие устройства подключаются и работают. В лог пишется инфо о неподключенном устройстве.

Скрипт
начало

var switcholdValue = []; // переменная предыдущих значений
var valueoldValue = []; // переменная предыдущих значений
var smstmout = 300; //Задержка отправки смс в сек.
var checktmout = 10; //Задержка проверки доступности датчиков в сек.
var valinf = []; // Переменная установки статусов датчиков value
var switchinf = []; // Переменная установки статусов датчиков switch

var valueretry = 5; //Количество попыток получить информацию с датчика
продолжение

var vkont = “ХОЛОДИЛЬНИК МИЦЕЛИЙ”;

// Делаем задержку

function sleep(milliseconds) {
  var date = Date.now();
  var currentDate = null;
  do {
    currentDate = Date.now();
  } while (currentDate - date < milliseconds);
}
продолжение2

// Имя вирт данных, реальный контрол устройства, тип, значение, рабочее значение(true/false) для “switch”, значение коррекции (int) для value, min; max для пределов значений показаний устройства, единицы измерения
var vdata = [
[“Температура в Холодильнике Мицелия”, “wb-w1/28-01144eeae0aa”,“value”,0, false, 0, 0, 4.2, “°C”],
[“Температура в Холодильнике Мицелия2”, “wb-w1/28-0114455ae0aa”,“value”,0, false, 0, 0, 4.2, “°C”],

];

log.warning ("Создаем виртуальный девайс " + vkont);
defineVirtualDevice(vkont, { // Создаем виртуальный девайс
title: vkont,
cells: {
“marked”: {
type: “text”,
readonly: true,
value: “1”
},
},
});

vdata.forEach(function(vd, numarr) {

			getDevice(vkont).addControl(vd[0], {
					type: vd[2],
					value: vd[3],
				});
			if (/Мицели*/.test(vd[0]) || /^Авария*/.test(vd[0]) || /^Газовый*/.test(vd[0])){
				if (vd[2] == "value"){
				getDevice(vkont).addControl("workvalue_" + vd[0], {
					type: "value",
					value: 0,
				});
				};	
				
				if (vd[2] == "switch"){
				getDevice(vkont).addControl("workvalue_" + vd[0], {
					type: "switch",
					readonly: true,
					value: vd[4],
				});
				};
				
			};

// Начало цикла повторов

		var retry = 0;
		while (retry < valueretry){
			try { // Попытка выполнить код
продолжение3
			if (getDevice("" + (vd[1]).match(/[^/]*/) + "").isControlExists("" + (vd[1]).match(/[^/]*$/) + "")){
					getControl(vkont + "/" + vd[0]).setValue(getControl(vd[1]).getValue()); //Установка текущих значений 
			} else {
			valinf[numarr]  = "error";
			};	
			
			setInterval(function(){ //проверка существования контрола
				if (getDevice("" + (vd[1]).match(/[^/]*/) + "").isControlExists("" + (vd[1]).match(/[^/]*$/) + "")){

									if (getControl(vd[1]).getError() != ""){
										
										valinf[numarr]  = "nodata";
										//valueoldValue[numarr] = valinf[numarr] ;
										log.warning  ("valueoldValue: " + valinf[numarr]  + ". Ошибка получения данных с устройства: " + vd[1] + " " + dev[vkont + "/" + vd[1]]);
										
										//dev[vkont + "/" + vd[0]] = -100;
										//dev[vkont + "/" + "workvalue_" + vd[0]] = -100;
									};
									
								} else {
									
									valinf[numarr]  = "error";
									log.warning  ("valueoldValue: " + valinf[numarr]  + ". Ошибка получения данных с устройства: " + vd[1] + " " + dev[vkont + "/" + vd[1]]);
									//valueoldValue[numarr] = valinf[numarr] ;
									
									//dev[vkont + "/" + vd[0]] = -200;
									//dev[vkont + "/" + "workvalue_" + vd[0]] = -200;
								};
			
			}, checktmout * 1000);

			setInterval(function(){ //Отправка смс
				
				if ((valueoldValue[numarr] == "nodata" || valueoldValue[numarr] == "error") && valinf[numarr]  == "normal"){
													global.__proto__.numto.forEach(function(num) {
														Notify.sendSMS(num, vkont + ". Восстановлена работа датчика " + vd[0] + ": " + dev[vkont + "/" + vd[0]] + " " + vd[8] + "! (" + global.__proto__.gmtdate + ")");
													});
													valueoldValue[numarr] = "normal";
				};
				if (valueoldValue[numarr] != "normal" && valinf[numarr]  == "normal"){
													global.__proto__.numto.forEach(function(num) {
														Notify.sendSMS(num, vkont + ". " + vd[0] + " в пределах нормы: " + dev[vkont + "/" + vd[0]] + " " + vd[8] + "! (" + global.__proto__.gmtdate + ")");
													});
													valueoldValue[numarr] = "normal"; 
				};
				if (valinf[numarr]  == "min"){
													global.__proto__.numto.forEach(function(num) {
														log.debug  (vkont + ". " + vd[0] + " меньше " + vd[6] + " " + vd[8] + ": " + dev[vkont + "/" + vd[0]] + "!");
														Notify.sendSMS(num, vkont + ". " + vd[0] + " меньше " + vd[6] + ": " + dev[vkont + "/" + vd[0]] + "  " + vd[8] + "! (" + global.__proto__.gmtdate + ")"); 
													});
													valueoldValue[numarr] = "min";
				};	
				if (valinf[numarr]  == "max"){
													global.__proto__.numto.forEach(function(num) {
														log.debug  (vkont + ". " + vd[0] + " больше " + vd[7] + " " + vd[8] + ": " + dev[vkont + "/" + vd[0]] + "!");
														Notify.sendSMS(num, vkont + ". " + vd[0] + " больше " + vd[7] + ": " + dev[vkont + "/" + vd[0]] + " " + vd[8] + "! (" + global.__proto__.gmtdate + ")"); 
													});
													valueoldValue[numarr] = "max";
				};	
				if (valinf[numarr]  == "nodata"){										
													global.__proto__.numto.forEach(function(num) {
														log.warning  (vkont + ". Нет информации от датчика " + vd[0] + ": более " + (smstmout / 60) + " минут! (" + global.__proto__.gmtdate + ")");	
														{Notify.sendSMS(num, vkont + ". Нет информации от датчика " + vd[0] + ": более " + (smstmout / 60) + " минут! (" + global.__proto__.gmtdate + ")");};
													});
													valueoldValue[numarr] = "nodata";
				};	
				if (valinf[numarr]  == "error"){										
													log.warning  (vkont + ". Не подключен или поврежден датчик " + vd[0] + "! (" + global.__proto__.gmtdate + ")");
													global.__proto__.numto.forEach(function(num) {
														Notify.sendSMS(num, vkont + ". Не подключен или поврежден датчик " + vd[0] + "! (" + global.__proto__.gmtdate + ")");
													});
													valueoldValue[numarr] = "error";
				};	
				if (switchinf[numarr] == "avar"){	
													global.__proto__.numto.forEach(function(num) {
														log.debug  (vkont + ". " + vd[0] + "!");
														Notify.sendSMS(num, vkont + ". " + vd[0] + "! (" + global.__proto__.gmtdate + ")"); 
													});
													switcholdValue[numarr] = "avar";

				};	
				if (switchinf[numarr] == "normal"){	
													global.__proto__.numto.forEach(function(num) {
														log.debug  ( vkont + ". Устранена " + vd[0] + "!");
														Notify.sendSMS(num, vkont + ". Устранена " + vd[0] + "! (" + global.__proto__.gmtdate + ")"); 
													});
													switcholdValue[numarr] = "normal";
				};
			}, smstmout * 1000);
			
			if (vd[2] == "value"){	
						defineRule(vd[0], { 
							whenChanged: vd[1],
							then: function(newValue, devName, cellName) { 
								
								if (getDevice("" + (vd[1]).match(/[^/]*/) + "").isControlExists("" + (vd[1]).match(/[^/]*$/) + "")){

									if (getControl(vd[1]).getError() == ""){

										getControl(vkont + "/" + vd[0]).setValue(getControl(vd[1]).getValue() + vd[5]); //Установка текущих значений 
										if (getDevice(vkont).isControlExists("workvalue_" + vd[0])){
											getControl(vkont + "/" + "workvalue_" + vd[0]).setValue(getControl(vd[1]).getValue() + vd[5]); //Установка текущих значений
										};
												
										if (dev[vkont + "/" + vd[0]] < vd[6]){
											
											valinf = "min";
											//valueoldValue[numarr] = valinf;
											log.warning  ("valueoldValue: " + valinf + ". " + vd[0] + ": " + dev[vkont + "/" + vd[0]]);
										};
										if (dev[vkont + "/" + vd[0]] > vd[7]){

											valinf = "max";
											//valueoldValue[numarr] = valinf;
											log.warning  ("valueoldValue: " + valinf + ". " + vd[0] + ": " + dev[vkont + "/" + vd[0]]);
										};
										if (dev[vkont + "/" + vd[0]] < vd[7] && dev[vkont + "/" + vd[0]] > vd[6]){		
										
											valinf = "normal";
											//valueoldValue[numarr] = valinf;
											//log.warning  ("valueoldValue: " + valinf + ". Температура: " + dev[vkont + "/" + vd[0]]);
										
										};
									};
								
								};

						}});
			};
				
				
			if (vd[2] == "switch" ){
					getDevice(vkont).getControl(vd[0]).setReadonly(true);
					switcholdValue[numarr] = 	getControl(vd[1]).getValue(); //Установка старого(текущего) значения 
					
						defineRule(vd[0]+1, {
							asSoonAs: function () {
							return dev[vd[1]];
							},
							then: function (newValue, devName, cellName) {	
											dev[vkont + "/" + vd[0]] = dev[vd[1]];	
											//setTimeout(function () {
													if (dev[vkont + "/" + vd[0]] != vd[4] && dev[vkont + "/" + vd[0]] != switcholdValue[numarr]){
														
														switchinf = "avar";
														switcholdValue[numarr] =  newValue; //Установка нового(текущего) значения
														
													};
											//}, smstmout * 1000);
							}});
						
						defineRule(vd[0]+2, {
							asSoonAs: function () {
							return !dev[vd[1]];
							},
							then: function (newValue, devName, cellName) {	
											dev[vkont + "/" + vd[0]] = dev[vd[1]];	
											//setTimeout(function () {
													if (dev[vkont + "/" + vd[0]] != vd[4] && dev[vkont + "/" + vd[0]] != switcholdValue[numarr]){
														
														switchinf = "normal";
														switcholdValue[numarr] =  newValue; //Установка нового(текущего) значения
														
													};
											//}, smstmout * 1000);
							}});
												
				};
		retry = valueretry; // Если все ок - завершаем цикл
				
		} catch (erroftry) {
						// Если есть ошибки ...выполнение прыгает сюда
						log.warning  ( erroftry.name );
						log.warning  ( erroftry.message );
						if (erroftry.name == "TypeError") { 
						  log.warning  ( vd[0] + ", " + vd[1] + " устройство не готово, мы попробуем получить данные ещё раз." );
						  sleep(checktmout * 1000);
						  };
						retry++; // Повторяем указанное кол-во раз
		};
конец
};

});

1 лайк