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