Проверка корректности топика при его подстановке в правило

Здравствуйте. Ниже текст правила (шаблона) терморегулятора. Значения топиков датчика и реле являются вирт устройствами. Вопрос: как проверить корректность введенного в таком варианте значения топика и возможно есть более правильный способ создания шаблонов для устройств типа термостатов, вентустановок и т.д. ?

// терморегулятор 
//  принцип действия
// создается вирт устройство с полями термометра реле температуры гистерезиса и признак режима работв нагрев (true) или охлаждение (false)  
// если охлаждение (false) то это аналог включения вентилятора для охлаждения (т.е вкоючается выше заданной температуры отключается ниже)
// если нагрев (true) то это пример нагревателя (розетки) т.е. он включается ниже заданной температуры и отключается выше


//Эти переменные должны быть уникальными для каждого регулятора
var tc_name="tc03" // имя терморегулятора английское
var tc_name01="Thermostat03" // имя терморегулятора для заголовка может быть такое же как и просто tc_name
var tc_name02="Регулятор вентилятор 14 " // Название для оповещения в телеграмм



// создаем вирт устройства

defineVirtualDevice (tc_name, {
    title: tc_name01,
    cells: {
     // вирт устр выбор автоматическое или ручное (вкл автомат) регулирование
      tc_auto: {
        title: "tc_auto",
	    type: "switch",
	    value: false
	    },
     // вирт устр выбор режима регулирования если включен то нагрев если выкл то охлаждение
      // false вентилятор,  true нагреватель
      tc_oper: {
        title: "tc_oper",
	    type: "switch",
	    value: false
	    },
      // вирт устр отправлять в телегу
      tc_telega: {
        title: "tc_telega",
	    type: "switch",
	    value: false
	    },
      // уставка температуры
      tc_set: {
        title: "tc_set",
	    type: "temperature",
	    value: 34,
      readonly: false
	    },
      
      // гистерезис  если 1 градус то задержка регулирования +-1  от 20 напрмер 19-21
      tc_gist: {
        title: "tc_gist",
	    type: "temperature",
	    value: 2,
      readonly: false
	    },
      
      // значение топика термометра 1 например wb-w1/28-051781190aff
       tc_term: {
        title: "tc_term",
	    type: "text",
	    value: "wb-w1/28-00000eb83ee7",
      readonly: false
	    },
      
       // значение топика реле например wb-mr3_16/K1
       tc_rele: {
        title: "tc_rele",
	    type: "text",
	    value: "wb-mio-gpio_140:4/K1",
        readonly: false
	    },
        // комментарий ни на что не влияет
       tc_coment: {
        title: "tc_coment",
	    type: "text",
	    value: "Комемнтарий ни на что не влияет",
        readonly: false
	    }
      
     
    }
});




defineRule("tc1", { 
  whenChanged: [dev[tc_name+"/tc_term"], tc_name+"/tc_auto", tc_name+"/tc_oper", tc_name+"/tc_set", tc_name+"/tc_gist" ], // топики, при изменении которых сработает правило
  then: function (newValue, devName, cellName) {
    log("devName:{}, cellName:{}, newValue:{}", devName, cellName, newValue); // вывод сообщения в лог  
    log(dev[tc_name+"/tc_term"], dev[dev[tc_name+"/tc_term"]], dev[dev[tc_name+"/tc_rele"]], dev[tc_name+"/tc_rele"],dev[tc_name+"/tc_set"]+dev[tc_name+"/tc_gist"], dev[tc_name+"/tc_auto"],dev[tc_name+"/tc_oper"]);
       

    
    	if (dev[tc_name+"/tc_auto"])
    
      {
      		if (dev[dev[tc_name+"/tc_term"]]>(dev[tc_name+"/tc_set"]+dev[tc_name+"/tc_gist"])) 
            {
              // log("больше");
              if (dev[tc_name+"/tc_oper"]) {dev[dev[tc_name+"/tc_rele"]]= false} else {dev[dev[tc_name+"/tc_rele"]]= true }; // если темп больше set+gist то 
            };
            if (dev[dev[tc_name+"/tc_term"]]<(dev[tc_name+"/tc_set"]-dev[tc_name+"/tc_gist"]))
            {
              // log("меньше");
              if (dev[tc_name+"/tc_oper"]) {dev[dev[tc_name+"/tc_rele"]]= true} else {dev[dev[tc_name+"/tc_rele"]]= false }; // если темп меньше set-gist то 
            };      
      };
      
      
  }
});


var telega1=defineRule("telega1",{
  whenChanged: [tc_name+"/tc_auto", tc_name+"/tc_oper", tc_name+"/tc_set", tc_name+"/tc_gist" ], // топики, при изменении которых сработает правило
   then: function (newValue, devName, cellName) {
     if (dev[tc_name+"/tc_telega"]){
     
   dev["telega_send/telega_message"]= tc_name02+" изменение настроек %0A Регулирование:"+dev[tc_name+"/tc_auto"]+"%0A Режим работы:"+dev[tc_name+"/tc_oper"]+
  "%0A Уведомление в телеграмм: "+dev[tc_name+"/tc_telega"]+"%0A Уставка температуры:"+dev[tc_name+"/tc_set"]+"%0A Гистерезис:"+dev[tc_name+"/tc_gist"];
   dev["telega_send/telega_send1"]=true;  
     };   
     }
});

var telega2=defineRule("telega2",{
  whenChanged: [dev[tc_name+"/tc_rele"] ], // топики, при изменении которых сработает правило
   then: function (newValue, devName, cellName) {
     
     if (dev[tc_name+"/tc_telega"]){ 
   	dev["telega_send/telega_message"]=tc_name02+" изменение состояния реле%0AНовое состояние:"+dev[dev[tc_name+"/tc_rele"]];
   	dev["telega_send/telega_send1"]=true;  
     };
   }
});

// если tc_name+"/tc_telega" то разрешаем или запрещаем уведомления (если false то отдельно посылвем что отключено)
defineRule("telega_ini",{
  whenChanged: [tc_name+"/tc_telega"], // топики, при изменении которых сработает правило
   then: function (newValue, devName, cellName) {
   if (dev[tc_name+"/tc_telega"]) 
   {
     enableRule(telega1);
     enableRule(telega2);
   }
     else
     {
       disableRule(telega1);
       disableRule(telega2);
      };
     log ("ntktuf1");
    dev["telega_send/telega_message"]=tc_name02+" изменение настроек %0A Уведомления в телеграмм:"+dev[tc_name+"/tc_telega"];
   	dev["telega_send/telega_send1"]=true; 
   }
});




Вот такие конструкции можно еще писать так: dev[tc_name]["tc_auto"]

Это здорово;)

Но вопрос был как проверить корректность конструкции
dev[dev[текстовое поле]] где текстовое поле принимает или не принимает значение ссылки на топик. Т.е. текстовое поле равно или не равно например существующему топику device/pole

А почему не просто isControlExists()?
Ну, хотя бы вот?