WB7 переполнение ОЗУ

Коллеги, добрый день! В в продолжении темы. Более месяца все работало норм, сейчас опять память переполнилась. Не может ли быть виновником зиг би устройства?
Спасибо!

Добрый день,
Для диагностики проблемы пришлите, пожалуйста, архив с диагностической информацией контроллера. Создание архива описано в документации.

приложен диагностический архив, доступен только сотрудникам поддержки
(175,3 КБ)

Добрый день,
Проанализировал логи ваши можете устранить проблемы ошибки связанные с попыткой конвертации значений типа string в другие типы (boolean и integer). Проблемы возникают при вызовах методов SetValue() для контролов DevTest1/Auto_On и DevTest1/clear_error.

Из-за них невозможно адекватно определить причину проблемы.

Добрый день, удалось ли решить вопрос?

В коде контролов DevTest1/Auto_on и DevTest1/Clear_error нету.

Обратите внимание на данный вывод логов.

Oct 07 17:02:47 wirenboard-A5OHHJGI wb-rules[1752]: WARNING: converting value '3' to boolean 'true'
Oct 07 17:02:47 wirenboard-A5OHHJGI wb-rules[1752]: WARNING: converting value '3' to boolean 'true'
Oct 07 17:02:47 wirenboard-A5OHHJGI wb-rules[1752]: ERROR: control DevTest1/Auto_On SetValue() error: can't convert control value 'true' (type string) to datatype '1'
Oct 07 17:02:47 wirenboard-A5OHHJGI wb-rules[1752]: WARNING: converting value '3' to boolean 'true'
Oct 07 17:02:47 wirenboard-A5OHHJGI wb-rules[1752]: ERROR: control DevTest1/clear_error SetValue() error: can't convert control value 'false' (type string) to datatype '3'
Oct 07 17:02:49 wirenboard-A5OHHJGI wb-rules[1752]: WARNING: converting value '3' to boolean 'true'
Oct 07 17:02:49 wirenboard-A5OHHJGI wb-rules[1752]: WARNING: converting value '3' to boolean 'true'
Oct 07 17:02:49 wirenboard-A5OHHJGI wb-rules[1752]: ERROR: control DevTest1/Auto_On SetValue() error: can't convert control value 'true' (type string) to datatype '1'
Oct 07 17:02:49 wirenboard-A5OHHJGI wb-rules[1752]: WARNING: converting value '3' to boolean 'true'
Oct 07 17:02:49 wirenboard-A5OHHJGI wb-rules[1752]: ERROR: control DevTest1/clear_error SetValue() error: can't convert control value 'false' (type string) to datatype '3'
Oct 07 17:02:51 wirenboard-A5OHHJGI wb-rules[1752]: WARNING: converting value '3' to boolean 'true'
Oct 07 17:02:51 wirenboard-A5OHHJGI wb-rules[1752]: WARNING: converting value '3' to boolean 'true'
Oct 07 17:02:51 wirenboard-A5OHHJGI wb-rules[1752]: ERROR: control DevTest1/Auto_On SetValue() error: can't convert control value 'true' (type string) to datatype '1'
Oct 07 17:02:51 wirenboard-A5OHHJGI wb-rules[1752]: WARNING: converting value '3' to boolean 'true'
Oct 07 17:02:51 wirenboard-A5OHHJGI wb-rules[1752]: ERROR: control DevTest1/clear_error SetValue() error: can't convert control value 'false' (type string) to datatype '3'
Oct 07 17:02:53 wirenboard-A5OHHJGI wb-rules[1752]: WARNING: converting value '3' to boolean 'true'
Oct 07 17:02:53 wirenboard-A5OHHJGI wb-rules[1752]: WARNING: converting value '3' to boolean 'true'
Oct 07 17:02:53 wirenboard-A5OHHJGI wb-rules[1752]: ERROR: control DevTest1/Auto_On SetValue() error: can't convert control value 'true' (type string) to datatype '1'
Oct 07 17:02:53 wirenboard-A5OHHJGI wb-rules[1752]: WARNING: converting value '3' to boolean 'true'
Oct 07 17:02:53 wirenboard-A5OHHJGI wb-rules[1752]: ERROR: control DevTest1/clear_error SetValue() error: can't convert control value 'false' (type string) to datatype '3'
Oct 07 17:02:55 wirenboard-A5OHHJGI wb-rules[1752]: WARNING: converting value '3' to boolean 'true'
Oct 07 17:02:55 wirenboard-A5OHHJGI wb-rules[1752]: WARNING: converting value '3' to boolean 'true'
Oct 07 17:02:55 wirenboard-A5OHHJGI wb-rules[1752]: ERROR: control DevTest1/Auto_On SetValue() error: can't convert control value 'true' (type string) to datatype '1'
Oct 07 17:02:55 wirenboard-A5OHHJGI wb-rules[1752]: WARNING: converting value '3' to boolean 'true'
Oct 07 17:02:55 wirenboard-A5OHHJGI wb-rules[1752]: ERROR: control DevTest1/clear_error SetValue() error: can't convert control value 'false' (type string) to datatype '3'м

Код, где предполагается использование вышеупомянутых контролов


//ПИД для ЧП Elhard
//Сюда ввести адрес ЧП
var addr_freq ="1";
//Сюда ввести адреса датчиков фаз
var addr_t_fase1 = "8" // Фаза1
var addr_t_fase2 = "9" // Фаза2
var addr_t_fase3 = "10" // Фаза 3
var addr_t_fase0 = "14" // Фаза0

// Сюда ввести адреса датчиков фаз
var addr_t_pom1="219" // Первый датчик
var addr_t_pom2="777" // Второй датчик

//Сюда название устройства (виртуального)
var devtestName="DevTest"
// Сюда ввести ID DevTest(Виртуального устройства)
var devtestID="1"
//Фомируем название виртуального устройства
var devtestall=devtestName+devtestID;

  //Название устройства для пользователя
var devtestTitle="Николаевский"
var flag_freq_conn =true;
var Freq=0;
var temp_setpoint;
var ki;
var kd;
var kp;
var output=0;
var count;
var flagStat;
var devarr = [
   
     {DEV: 'Elhard_EMD_Mini_'+addr_freq+'/Frequency (HZ)', DEVN: 'Freq'},//0
  
    {DEV: 'Elhard_EMD_Mini_'+addr_freq+'/State System', DEVN: 'System State'},//1
      {DEV: 'Elhard_EMD_Mini_'+addr_freq+'/Frequency out (HZ)',DEVN: 'Operating frequency' },//3 
     
  {DEV: 'Elhard_EMD_Mini_'+addr_freq+'/Frequency State (HZ)', DEVN:'Set frequency'},//2
   {DEV: 'Elhard_EMD_Mini_'+addr_freq+'/Ratation motor speed out (RPM)', DEVN:'Linear speed'},//4
  {DEV: 'Elhard_EMD_Mini_'+addr_freq+'/Outpot Tok (A)',DEVN: 'Output current'},//5
   {DEV: 'Elhard_EMD_Mini_'+addr_freq+'/Uptime (H)', DEVN: 'Uptime'},//6
  {DEV: 'Elhard_EMD_Mini_'+addr_freq+'/Output Voltage (V)', DEVN: 'Output voltage'},//7
  {DEV: 'Elhard_EMD_Mini_'+addr_freq+'/Tekushi kod avarii',DEVN: 'Error control'},//8
      {DEV: 'Elhard_EMD_Mini_'+addr_freq+'/State on', DEVN: 'StateOn'},
    {DEV: 'Elhard_EMD_Mini_'+addr_freq+'/State Off', DEVN: 'StateOff'},
       {DEV: 'Elhard_EMD_Mini_'+addr_freq+'/Error Clear',DEVN: 'Error Clear'},
  {DEV: 'CWT-THXXS TH_'+addr_t_fase1+'/Temperature',DEVN:'FASE1',DEVID:'ID_Fase1'},
  {DEV: 'CWT-THXXS TH_'+addr_t_fase2+'/Temperature',DEVN:'FASE2',DEVID:'ID_Fase2'},
  {DEV: 'CWT-THXXS TH_'+addr_t_fase3+'/Temperature',DEVN:'FASE3',DEVID:'ID_Fase3'},
  {DEV: 'CWT-THXXS TH_'+addr_t_fase0+'/Temperature',DEVN:'FASE0',DEVID:'ID_Fase0'},
   {DEV: 'wb-ms_'+addr_t_pom1+'/Temperature', DEVN:'IN_Temp1',DEVID:'ID_Temp1' ,DEVREL: 'PomTEMP'}, // Датчик в помещении первый
  {DEV: 'wb-ms_'+addr_t_pom2+'/Temperature',DEVN:'IN_Temp2',DEVID:'ID_Temp2',DEVREL: 'PomTEMP'},// Датчик в помещении второй
   
  //{ERROR_CLEAR: 'Elhard_EMD_Mini_23/Error Clear'}  
];

var virtual_dev = [
    {DEV: devtestall+'/Auto_On', DEVN: 'StateOn'},// Включатель ВУ
  {DEV: devtestall+'/freq_state1',DEVN:'Operating frequency'}, //Частота выходная из частотника 
 // Датчики фазные
   {DEV: devtestall+'/Fase1',DEVN:'FASE1',DEVREL: 'FaseTEMP',TRANS:"Т.Фазы1"}, // Фазный датчик фазы1
   {DEV: devtestall+'/Fase2',DEVN:'FASE2',DEVREL: 'FaseTEMP',TRANS:"Т.Фазы2"}, // Фазный датчик Фазы2
   {DEV: devtestall+'/Fase3', DEVN: 'FASE3',DEVREL: 'FaseTEMP',TRANS:"Т.Фазы3"}, // Фазный датчик Фазы3
   {DEV: devtestall+'/Fase0',DEVN: 'FASE0',DEVREL: 'FaseTEMP',TRANS:"Т.Фазы0"}, // Фазный датчик Фазы4
  // Модели датчиков температуры
  {DEV: devtestall+'/ID_Temp1',DEVN: 'ID_Temp1'}, // Модель датчика температуры 1 в помещении
    {DEV: devtestall+'/ID_Temp2',DEVN: 'ID_Temp2',}, // Модель датчика температуры 2 в помещении
//Модели датчиков  фаз  
  {DEV: devtestall+'/ID_Fase1',DEVN: 'ID_Fase1',DEVID:'ID_Fase1'}, // Модель датчика температуры 1 в помещении
    {DEV: devtestall+'/ID_Fase2',DEVN: 'ID_Fase2',DEVID:'ID_Fase2'}, // Модель датчика температуры 2 в помещении
       {DEV: devtestall+'/ID_Fase3',DEVN: 'ID_Fase3',DEVID:'ID_Fase3'}, // Модель датчика температуры 1 в помещении
    {DEV: devtestall+'/ID_Fase0',DEVN: 'ID_Fase0',DEVID:'ID_Fase0'}, // Модель датчика температуры 2 в помещении
  //Датчики в помещении
  {DEV: devtestall+'/In_Temp1',DEVN:'IN_Temp1',DEVREL:'PomTEMP'},// Показания температуры из датчика
   {DEV: devtestall+'/In_Temp2',DEVN:'IN_Temp2',DEVREL:'PomTEMP'},
  {DEV: devtestall+'/Freq', DEVN:'Freq'},// Выход из ПИДа на ВУ
  {DEV: devtestall+'/State_System',DEVN:'System State'},// Состояние ЧП
   {DEV: devtestall+'/error_kod',DEVN:'Error control'},// Ошибки в ЧП
  
   {DEV: devtestall+'/Temp_Setpoint', DEVN: 'Temp_Setpoint'}, // Установка поддерживаемой температуры
   {DEV: devtestall+'/kp', DEVN:'kp'},
   {DEV: devtestall+'/ki',DEVN: 'ki'},
   {DEV: devtestall+'/kd',DEVN: 'kd'},
   {DEV: devtestall+'/clear_error',DEVN: 'Error Clear'}, //Кнопка сброса ошибок
   {DEV: devtestall+'/Avg_tempBox', DEVN: 'Avg_tempBox'}, // Средняя темература в вводном шкафу
   {DEV: devtestall+'/Max_tempBox',  DEVN: 'Max_tempBox'},// Наивысшая температура в вводном шкафу
 
  ];

//log.info(devtestall.freq_state1)
//DEV - Значение тоика
// DEVIN - Название устройства (как в функции виртуального устройства)
//DEVID - Идентификатор устройства
// DEVREL- Принадлежность (для датчиков температуры - фазы или помещение)




//Виртуальное устройство помещения
defineVirtualDevice(devtestall, {
title: devtestTitle,
cells: {
 Auto_On: {
title: "Автоматизация",  
type: "switch",
value: true,
order: 0
 },
  Temp_Setpoint: {
title: "Установка поддерживаемой температуры",
type: "range",
value: 20, // какое-то значение по умолчанию
min: -1, // минимальное значение уставки
max: 45, // максимальное значение уставки
order: 1
},
State_System: {
title: "Состояние ЧП:",
type: "text",
value: false,
  order: 2
},
Freq: {
title: "Заданная частота ПИД (Гц):",
type: "text",
value: false,
max: 100,
  order: 3
},
   freq_state1: {
title: "Текущая частота на ЧП(Гц):",
type: "text",
value: false,
     order: 4
},

In_Temp1: {
title: "Температура в помещени Д.1:",
type: "text",
value: false,
 order: 5
},
  In_Temp2: {
title: "Температура в помещени Д.2:",
type: "text",
value: false,
 order: 6
},
Fase0: {
title: "Температура фазы 0:",
type: "text",
value: false,
 order: 7
},
Fase1: {
title: "Температура фазы 1:",
type: "text",
value: false,
 order: 8
},
   Fase2: {
title: "Температура фазы 2:",
type: "text",
value: false,
 order: 9
},
  Fase3: {
title: "Температура фазы 3:",
type:"text",
value: false,
 order: 10
},
  Avg_tempBox: {
title: "Температура средняя в шкафу: ",
type: "text",
value: false,
 order: 11
},
  Max_tempBox: {
title: "Температура наивысшая в шкафу:" ,
type: "text",
value: false,
 order: 12
},
//Пропорциональная составляющая
kp: {
title: "Пропорциональная составляющая: ",
type: "range",
value: 5,
min: 1,
max: 50,
  order: 13
},
//Интегральная составляющая
ki: {
  title: "Интегральная составляющая составляющая: ",
type: "range",
value: 2,
min: 0.2,
max: 30,
  order: 14
},
//Дифферинциальная составляющая
kd: {
  title: "Дифферинциальная составляющая составляющая:",
type: "range",
value: 0.5,
min: 0.2,
max: 30,
  order: 15
},
 error_kod: {
title: "Код ошибки:",
type: "text",
value: false,
order: 16
},
  clear_error: {
title: "Сброс ошибки ЧП:",
type: "pushbutton",
value: false,
    order: 17

},
ID_Temp1: {
title: "Дат. Темп. 1 в ПОМ:",
type: "text",
value: false,
  order: 18
},
  ID_Temp2: {
title: "Дат. Темп 2 в ПОМ:",
type: "text",
value: false,
  order: 19
},
ID_Fase1: {
title: "Дат. Темп. Фазы 1:",
type: "text",
value: false,
  order: 20
},
ID_Fase2: {
title: "Дат.Темп Фазы 2:",
type: "text",
value: false,
  order: 21
},
ID_Fase3: {
title: "Дат. Темп. Фазы 3:",
type: "text",
value: false,
  order: 22
},
ID_Fase0: {
title: "Дат. Темп. Фазы 0:",
type: "text",
value: false,
  order: 23
},
},
});
//arr();
function set_status () {
  var tavgbox=0;
var tmaxbox=0;
 var avgtemp_Pom=0;
  var faseSenserArr =[];
var pomSensorArr =[];
  
 for(i=0; i<virtual_dev.length; i++) // Цикл для массива виртуального устройства
      { 
        for(i1=0; i1<devarr.length; i1++) // Цикл для массива реальных устройств
          {
     
            
              
            
            if(virtual_dev[i].DEVN==devarr[i1].DEVN &&!dev[devarr[i1].DEV+"#error"] &&dev[virtual_dev[i].DEV]!=String(dev[devarr[i1].DEV]))
      {
dev[virtual_dev[i].DEV]=String(dev[devarr[i1].DEV]);

if(virtual_dev[i].DEVN=="System State")
{
        
         switch(dev[devarr[i1].DEV])
  {  case 1:
    dev[virtual_dev[i].DEV] ="ЧП включен";
      flagStat="On"
     
      break;
    case 0:
      dev[virtual_dev[i].DEV] ="ЧП выключен"; 
      flagStat="Off"
       break;
} 
        
}   
       
       //log.info(dev[devarr[1].DEV])
       
    
            
         }
  if(virtual_dev[i].DEVN==devarr[i1].DEVN &&dev[devarr[i1].DEV+"#error"])
       {
dev[virtual_dev[i].DEV]="Ошибка Связи";
      
        
       }
        
           if(virtual_dev[i].DEVN==devarr[i1].DEVN &&dev[devarr[i1].DEV]==null)
        {
          dev[virtual_dev[i].DEV]="Устройство не прописано";
        }

           
            if( virtual_dev[i].DEVN=="StateOn"&& devarr[i1].DEVN=="StateOn" && dev[virtual_dev[i].DEV] && flagStat!="On"&&dev[virtual_dev[i].DEV]!="Устройство не прописано" && dev[virtual_dev[i].DEV]!="Ошибка Связи") 
{

  dev[devarr[i1].DEV]=true;
   log.info(devarr[i1].DEV)
 flagStat="On";
 
//log.info(dev[virtual_dev[i].DEV])
}
            
            


            
    if(virtual_dev[i].DEVN=="StateOn"&& devarr[i1].DEVN=="StateOff" && !dev[virtual_dev[i].DEV] && flagStat!="Off"&&dev[virtual_dev[i].DEV]!="Устройство не прописано" && dev[virtual_dev[i].DEV]!="Ошибка Связи") 
{
 
  dev[devarr[i1].DEV]=true;
     flagStat="Off"
  log.info(virtual_dev[i].DEV)
 
}           

            
            //Занесение модели датчиков температуры в Дев.Тест
            if(virtual_dev[i].DEVN==devarr[i1].DEVID)
        {
           dev[virtual_dev[i].DEV]=devarr[i1].DEV;
           
        } 
         //Создание массива датчиков фаз
             if(virtual_dev[i].DEVN=="Freq" && devarr[i1].DEVN=="Freq"&& dev[virtual_dev[i].DEV]!=output && dev[virtual_dev[i].DEV]!="Устройство не прописано" && dev[virtual_dev[i].DEV]!="Ошибка Связи")
        {
         
         
          dev[devarr[i1].DEV]=output;
         
         
        }
         
          } //Закрывающа счетчика i1
       
      if(virtual_dev[i].DEVREL=="FaseTEMP"&& dev[virtual_dev[i].DEV]!="Устройство не прописано" && dev[virtual_dev[i].DEV]!="Ошибка Связи")
          {
faseSenserArr.push(parseFloat(dev[virtual_dev[i].DEV]))
           
          }    
       
        if(virtual_dev[i].DEVREL=="PomTEMP" && dev[virtual_dev[i].DEV]!="Устройство не прописано" && dev[virtual_dev[i].DEV]!="Ошибка Связи")
        {

          pomSensorArr.push(parseFloat(dev[virtual_dev[i].DEV]))
         
          
        }
       
    switch(virtual_dev[i].DEVN)
      {
        case "Temp_Setpoint":
          temp_setpoint=dev[virtual_dev[i].DEV];
          break;
        case "kp":
          kp=dev[virtual_dev[i].DEV];
          break;
        case "ki":
          ki=dev[virtual_dev[i].DEV];
          break;
        case "kd":
          kd=dev[virtual_dev[i].DEV];
          break;
      }
       
        
      }//Закрывающа счетчика i
  //Определяем среднюю и максимальную температуру по фазам
       for(f=0; f<faseSenserArr.length; f++)
  {
 
    tavgbox+=faseSenserArr[f]/faseSenserArr.length;
 
    tmaxbox= Math.max.apply(null, faseSenserArr);
  }
  for(f1=0; f1<pomSensorArr.length; f1++)
    {
avgtemp_Pom+=pomSensorArr[f1]/pomSensorArr.length;
    
    }
for(i=0;i<virtual_dev.length; i++)
  {
  if(virtual_dev[i].DEVREL=="FaseTEMP"&& dev[virtual_dev[i].DEV]==tmaxbox)
   {
var countFase=i;
   
     
   }
    
    switch (virtual_dev[i].DEVN)
        {
          case "Avg_tempBox":
            dev[virtual_dev[i].DEV]=String(tavgbox.toFixed(1));
          
          break;
         case "Max_tempBox":
            if(faseSenserArr.length!=0)
            {
            dev[virtual_dev[i].DEV]=virtual_dev[countFase].TRANS+"-   "+String(tmaxbox.toFixed(1));
            }
            
            break;
        }
   
  }

  
   

  return avgtemp_Pom.toFixed(3);
}

  
   

 
// Начало кода PID регулятора
var Pid = function(opts) { //Конструктор объектов
opts = opts || {};
this._target = opts.target //|| 0;
this._kp = -opts.kp || 0;
this._ki = opts.ki || 0;
this._kd = opts.kd || 0;
this._outputMin = opts.outputMin || 0;
this._outputMax = opts.outputMax === undefined ? 1 : opts.outputMax;
this._lastTime = null;
this._intervalId = null;
};

Pid.prototype.clip = function(x, min, max) { //Функция ограничения выходных значений регулирующего устройства
if (x < min){
return min;
} else if (x > max) {
return max;
} else {
return x;
}
};

Pid.prototype._clearErrors = function() { //Функция очистки накопленной ошибки PID регулятора
this._sumError = 0;
this._lastError = 0;
this._lastTime = null;
};

Pid.prototype.setup = function(opts) {
this._target = opts.target === undefined ? this._target : opts.target;
this._kp = opts.kp === undefined ? this._kp : opts.kp;
this._ki = opts.ki === undefined ? this._ki : opts.ki;
this._kd = opts.kd === undefined ? this._kd : opts.kd;
this._outputMin =
opts.outputMin === undefined ? this._outputMin : opts.outputMin;
this._outputMax =
opts.outputMax === undefined ? this._outputMax : opts.outputMax;
this._clearErrors();
};

Pid.prototype.tune = function(opts) {
this._kp += opts.kp || 0;
this._ki += opts.ki || 0;
this._kd += opts.kd || 0;
this._clearErrors();
};

Pid.prototype.update = function(input) { //Функция PID регулятора
var date = new Date();
var dt = date.getTime() - this._lastTime;
var error = this._target - input;
var dError = 0;
var integralNormalized = 0;
var differential = 0;

if (this._lastTime) {
dError = error - this._lastError;
this._sumError += error;
integralNormalized = this._ki * this._sumError * dt;
differential = (this._kd * dError) / dt;
integralNormalized = -this.clip(
integralNormalized,
this._outputMin,
this._outputMax
);

} else {
this._clearErrors();
}

var output = this._kp * error + integralNormalized - differential;

output = this.clip(output, this._outputMin, this._outputMax);
this._lastError =error;
var date = new Date();
this._lastTime = date.getTime();
return output;
};

Pid.prototype.run = function(repeat, interval) {
if (!this._intervalID) {
this._intervalID = setInterval(repeat, interval * 1000);
this._clearErrors();
}
};

Pid.prototype.stop = function() {
if (this._intervalID) {
clearInterval(this._intervalID);
}
this._intervalID = null;
};
//Создаем объект с нужными параметрами PID регулятора

var myControl = new Pid({
target: 20, // требуемая величина выходного значения
kp: 5, // пропорциональная составляющая
ki: 2, // интегральная составляющая
kd: 0.5, // дифференциальная составляющая
outputMin: 0, // минимальное значение выхода
outputMax: 50 // максимальное значение выхода
});

myControl.run(function() {

var avgtemp_Pom= set_status()
  

var input = avgtemp_Pom; //Входное значение от виртуального устройства
 output = myControl.update(input); //Выходное значение
 output = Math.round(output);


  
   
  
  
myControl.target = temp_setpoint;
 

Out1 = output; //Выходное значение будет писаться в лог



myControl.kp = -kp; //Пример для подбора параметров PID
myControl.ki = ki;
myControl.kd = kd;
myControl.setup(myControl); //Пример для подбора параметров PID
 
  
}, 2); //Интервал запуска ПИД-регулятора каждые 200 мс


И в нем их нет, хотя раньше может и были

Попробуйте данную функцию для отлова данных и их типов

// Логирование типов данных и значений всех виртуальных устройств
defineRule("log_device_data", {
  whenChanged: function() {
    // Перебор всех устройств в массиве virtual_dev
    for (var i = 0; i < virtual_dev.length; i++) {
      // Получаем имя устройства и текущее значение
      var deviceName = virtual_dev[i].DEV;
      var deviceValue = dev[deviceName];
      
      // Проверяем наличие значения
      if (deviceValue !== undefined) {
        // Определяем тип данных значения
        var dataType = typeof deviceValue;

        // Логируем тип и значение устройства
        log.info("Устройство: " + deviceName + ", Тип данных: " + dataType + ", Значение: " + deviceValue);
      } else {
        log.info("Устройство: " + deviceName + " не имеет значения");
      }
    }
  },
  // Устанавливаем условие срабатывания на любое изменение устройства в virtual_dev
  when: function () {
    return true;
  }
});

В логах системы будут отображаться данные, подобные следующим:
INFO: Устройство: DevTest1/Auto_On, Тип данных: boolean, Значение: true
или иные.

Добрый день, удалось ли решить вопрос?

Я скрипт с ошибка выключил, память все равно расходуется. Потребляет память wb-mqtt-db.


Как эту службу проконтролировать?
Как будто создается новый процесс этого, а старый не убивается

Добрый день
Прошу выполнить
systemctl status wb-mqtt-db
И предоставить вывод команды

Есть так же метод принудительного ограничения максимального потребления ОЗУ
Внеся в файл /lib/systemd/system/wb-mqtt-db.service в графу service данный параметр MemoryLimit=100M

Для анализа возможной утечки рекомендую использовать данные команды

journalctl -u wb-mqtt-db -n 100
journalctl -u wb-rules -n 100

Добрый день, удалось ли решить проблему?