Здравствуйте. Ниже текст правила (шаблона) терморегулятора. Значения топиков датчика и реле являются вирт устройствами. Вопрос: как проверить корректность введенного в таком варианте значения топика и возможно есть более правильный способ создания шаблонов для устройств типа термостатов, вентустановок и т.д. ?
// терморегулятор
// принцип действия
// создается вирт устройство с полями термометра реле температуры гистерезиса и признак режима работв нагрев (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;
}
});