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

**URL:** <https://support.wirenboard.com/t/oshibka-esli-ustrojstvo-ne-najdeno/18309>\
**Category:** Без категории\
**Created:** [January 26, 2024, 10:50am UTC](https://support.wirenboard.com/t/oshibka-esli-ustrojstvo-ne-najdeno/18309 "2024-01-26T10:50:37Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![vepelnet](https://support.wirenboard.com/user_avatar/support.wirenboard.com/vepelnet/32/16248_2.png) [@vepelnet](https://support.wirenboard.com/u/vepelnet)\
**Post date:** [January 26, 2024, 10:50am UTC](https://support.wirenboard.com/t/oshibka-esli-ustrojstvo-ne-najdeno/18309/1 "2024-01-26T10:50:37Z")

</div>

День добрый!  
Читал тему [Отложенный запуск Wb-rules](https://support.wirenboard.com/t/otlozhennyj-zapusk-wb-rules/15436), но решения так и не нашел, ввиду того что правило не совсем такое как в примере.  
Поясню.  
Есть датчик температуры 18B20, подключен на W1.  
Ну и правило, которое шлет смс.  
[WB-V-KС-HOLOD1-1\_new.js](https://support.wirenboard.com/uploads/short-url/o6SFdZbbdduUeh7p9z1LBWArjcq.js) (9,5 КБ)  
[wb-rules\_20240126T123309.log](https://support.wirenboard.com/uploads/short-url/phs7UNrESX1hXsoGtlqAqDg0BS5.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. Переписать функцию получения данных с устройства, и если устройство не найдено - выдавать информацию.  
Есть такая возможность?

---

<div class="post-metadata">

**Author:** ![BrainRoot](https://avatars.discourse-cdn.com/v2/letter/b/c2a13f/32.png) [@BrainRoot](https://support.wirenboard.com/u/BrainRoot)\
**Post date:** [January 26, 2024, 11:06am UTC](https://support.wirenboard.com/t/oshibka-esli-ustrojstvo-ne-najdeno/18309/3 "2024-01-26T11:06:37Z")

</div>

Для “ответственых” датчиков типичным подходом является еще и периодический контроль их наличия с обработкой отсутствия, естественно.  
Вот как тут: [Сообщение при отключении или неисправности в Telegram - #3 от пользователя BrainRoot](https://support.wirenboard.com/t/soobshhenie-pri-otklyuchenii-ili-neispravnosti-v-telegram/10880/3)  
К сожалению не могу посмотреть в ваш скрипт, так как js запрещен на форуме.  
Выложите сам текст его отформатировав как код.  
И да, я бы начинал (активировал правило) после таймаута в 30, например секунд после старта контроллера.  
Но, хочу заметить что использование в правилах отсутствующих **в текущий** момент, при его создании контролов - к ошибкам не приводит.

---

<div class="post-metadata">

**Author:** ![vepelnet](https://support.wirenboard.com/user_avatar/support.wirenboard.com/vepelnet/32/16248_2.png) [@vepelnet](https://support.wirenboard.com/u/vepelnet)\
**Post date:** [January 26, 2024, 11:23am UTC](https://support.wirenboard.com/t/oshibka-esli-ustrojstvo-ne-najdeno/18309/4 "2024-01-26T11:23:46Z")

</div>

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

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

---

<div class="post-metadata">

**Author:** ![BrainRoot](https://avatars.discourse-cdn.com/v2/letter/b/c2a13f/32.png) [@BrainRoot](https://support.wirenboard.com/u/BrainRoot)\
**Post date:** [January 26, 2024, 12:08pm UTC](https://support.wirenboard.com/t/oshibka-esli-ustrojstvo-ne-najdeno/18309/5 "2024-01-26T12:08:37Z")

</div>

> [@vepelnet](#):
>
> Включается контроллер и он перестает работать вообще, даже с существующими датчиками.

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

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

---

<div class="post-metadata">

**Author:** ![vepelnet](https://support.wirenboard.com/user_avatar/support.wirenboard.com/vepelnet/32/16248_2.png) [@vepelnet](https://support.wirenboard.com/u/vepelnet)\
**Post date:** [January 26, 2024, 12:18pm UTC](https://support.wirenboard.com/t/oshibka-esli-ustrojstvo-ne-najdeno/18309/6 "2024-01-26T12:18:55Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![BrainRoot](https://avatars.discourse-cdn.com/v2/letter/b/c2a13f/32.png) [@BrainRoot](https://support.wirenboard.com/u/BrainRoot)\
**Post date:** [January 26, 2024, 4:37pm UTC](https://support.wirenboard.com/t/oshibka-esli-ustrojstvo-ne-najdeno/18309/7 "2024-01-26T16:37:00Z")

</div>

> [@vepelnet](#):
>
> Есть же штатная проверка существования контрола getDevice().isControlExists(). Зачем еще городить что-то?

Пример:

```auto
//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 строке - потому что нет самого **устройства** , которому он принадлежит.  
И да, наверно сделаю про это запрос разрабочикам - добавить функцию наличия самого устройства.

> [@vepelnet](#):
>
> Скиньте ваш скрипт, может что-то придумаю.

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

---

<div class="post-metadata">

**Author:** ![vepelnet](https://support.wirenboard.com/user_avatar/support.wirenboard.com/vepelnet/32/16248_2.png) [@vepelnet](https://support.wirenboard.com/u/vepelnet)\
**Post date:** [January 29, 2024, 5:20pm UTC](https://support.wirenboard.com/t/oshibka-esli-ustrojstvo-ne-najdeno/18309/8 "2024-01-29T17:20:42Z")

</div>

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

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

---

<div class="post-metadata">

**Author:** ![vepelnet](https://support.wirenboard.com/user_avatar/support.wirenboard.com/vepelnet/32/16248_2.png) [@vepelnet](https://support.wirenboard.com/u/vepelnet)\
**Post date:** [January 30, 2024, 9:00am UTC](https://support.wirenboard.com/t/oshibka-esli-ustrojstvo-ne-najdeno/18309/9 "2024-01-30T09:00:06Z")

</div>

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

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

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

---

<div class="post-metadata">

**Author:** ![BrainRoot](https://avatars.discourse-cdn.com/v2/letter/b/c2a13f/32.png) [@BrainRoot](https://support.wirenboard.com/u/BrainRoot)\
**Post date:** [January 30, 2024, 11:44am UTC](https://support.wirenboard.com/t/oshibka-esli-ustrojstvo-ne-najdeno/18309/10 "2024-01-30T11:44:56Z")

</div>

> [@vepelnet](#):
>
> Ниче не стыдно) Значит есть куда расти. Кидайте.

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

> [@vepelnet](#):
>
> Мой скрипт невозможно редактировать в web-редакторе по причине ошибки:
> 
> > File path should contains only digits, letters, whitespaces, ‘\_’ and ‘-’ chars

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

---

<div class="post-metadata">

**Author:** ![vepelnet](https://support.wirenboard.com/user_avatar/support.wirenboard.com/vepelnet/32/16248_2.png) [@vepelnet](https://support.wirenboard.com/u/vepelnet)\
**Post date:** [February 7, 2024, 5:35am UTC](https://support.wirenboard.com/t/oshibka-esli-ustrojstvo-ne-najdeno/18309/11 "2024-02-07T05:35:31Z")

</div>

Кстати, такая проблема проявляется на прошивке 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);
> }});
> 									
> };
> 
> ```
> 
> });

---

<div class="post-metadata">

**Author:** ![vepelnet](https://support.wirenboard.com/user_avatar/support.wirenboard.com/vepelnet/32/16248_2.png) [@vepelnet](https://support.wirenboard.com/u/vepelnet)\
**Post date:** [February 7, 2024, 1:02pm UTC](https://support.wirenboard.com/t/oshibka-esli-ustrojstvo-ne-najdeno/18309/12 "2024-02-07T13:02:03Z")

</div>

Дополню.  
Обновил контроллер, который был на 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++; // Повторяем указанное кол-во раз
> };
> 
> ```
> 
> > **конец**
> >
> > ```
> > };
> > 
> > ```
> > 
> > });

---

<div class="post-metadata">

**Author:** ![SmithLEDs](https://avatars.discourse-cdn.com/v2/letter/s/43a26b/32.png) [@SmithLEDs](https://support.wirenboard.com/u/SmithLEDs)\
**Post date:** [January 30, 2025, 12:28pm UTC](https://support.wirenboard.com/t/oshibka-esli-ustrojstvo-ne-najdeno/18309/14 "2025-01-30T12:28:30Z")

</div>

Полностью соглашусь!! Тоже столкнулся с данной проблемой. Хотел сделать проверку на корректность существования передаваемого топика (может буквой или цифрой ошибся пока пишешь в функцию, какие устройства обрабатывать например). А по факту после перезагрузки контроллера ругается, что такого устройства в системе нет!! Хотя в конфигурациях все правильно прописано. В итоге вообще убрал у себя эти проверки, смотрю только топики meta #error
