Передача значений с датчиков в правила js

  1. Оборудование.

Контроллер Wiren Board 7

Batch No
7.3.3C/1 645

Current uptime
0d 0h 31m

DTS Version
733

HW Revision
7.3.3

Manufacturing Date
2022-10-12 08:51:13

Release name
wb-2304

Release suite
stable

Short SN
A2NESPD2

Temperature Grade
industrial

Модуль WB MAI6

Датчик ОВЕН ПВТ110-Н4.А (температура + влажность 4…20мА)

  1. Стороннее ПО не использую. Но на WB установлен Light server GoodWAN (для приема показаний с беспроводных датчиков).

  2. С датчика ОВЕН получаю значения температуры и влажности (вижу их в WB).

  3. Написал правило js, требуется по значению температуры/влажности включать/отключать устройства.

  4. Проблема. Значение температуры и влажности в правило js не передаются.

  5. Можно воспроизвести сколь угодно раз.

  6. Конфигурация минимальна, лишнего нет.

  7. Добавил скрины и лог.
    Правило JS

defineVirtualDevice('Vent', {
    title: 'Вентустановка',
    cells: {
     
      mode: {//режим 0-ручной 1-автомат
        title: 'Режим АВТ',
	    type: 'switch',
	    value: false,
	    },
      settemp: {//уставка
        title: 'Уставка температуры',
	    type: 'range',
	    value: 25,
        min: 0,
        max: 40
	    },
      sethim: {//уставка
        title: 'Уставка влажности',
	    type: 'range',
	    value: 60,
        min: 0,
        max: 80
	    },
      controltemp: {
        title: 'Температура',
        type: 'value',
        units: 'deg C',
        value: 0
        },
      controlhim: {
        title: 'Влажность',
        type: 'value',
        units: '%',
        value: 0
        },
      hysttemp: {
        title: 'Гистерезис температуры',
	    type: 'range',
	    value: 0.5,
        min: 0,
        max: 5
	    },
      hysthim: {
        title: 'Гистерезис влажности',
	    type: 'range',
	    value: 0.5,
        min: 0,
        max: 5
	    },

   }
})
  

     
  defineRule('ruleventtemp', {   //правило для температуры
    
  whenChanged: 'wb-mai6_55/IN 6 P Value',  //тип правила (при изменении значения с датчика температуры, отобразить его в контроле, отобразить в логе)
   then: function (newValue, devName, cellName) {
   dev['Vent/controltemp'] = newValue;
   log('Изменилось значение температуры с датчика = {}', newValue);
    },
    
       
  whenChanged: ['Vent/controltemp', 'Vent/settemp', 'Vent/mode', 'Vent/hysttemp'], //тип правила (при изменении значения от датчика, уставки, режима работы, запускаем алгоритм включения/отключения вентилятора)
  then: function () { //при изменении есть функция 
    
   log('Изменилось значение Vent/controltemp, Vent/settemp, Vent/mode, Vent/hysttemp');
    
    if (dev['Vent/mode'] == true) {
    	if ( dev['Vent/controltemp'] > dev['Vent/settemp'] + dev['Vent/hysttemp']) { //если температура датчика ,больше уставки + гистерезис
      	dev["wb-modbus-1-0/START"] = true;
        dev['wb-modbus-1-0/SETPOINT'] = 500;
        dev['wb-dac/EXT3_O5'] = 10000;
    	}
    	if (dev['Vent/controltemp'] < dev['Vent/settemp'] - dev['Vent/hysttemp']) { //если температура датчика меньше уставки - гистерезис
      	dev['wb-modbus-1-0/START'] = false;
        dev['wb-modbus-1-0/SETPOINT'] = 200;
        dev['wb-dac/EXT3_O5'] = 0;
    	}
    }
    else dev['wb-modbus-1-0/START'] = false;
         dev['wb-modbus-1-0/SETPOINT'] = 200;
         dev['wb-dac/EXT3_O5'] = 0;
  }
});


 defineRule('ruleventhim', {   //правило для влажности
    
  whenChanged: 'wb-mai6_55/IN 6 N Value',  //тип правила (при изменении значения с датчика ВЛАЖНОСТИ, отобразить его в контроле, отобразить в логе)
   then: function (newValue, devName, cellName) {
   dev['Vent/controlhim'] = newValue;
   log('Изменилось значение температуры с датчика = {}', newValue);
    },
    
       
  whenChanged: ['Vent/controlhim', 'Vent/sethim', 'Vent/mode', 'Vent/hystvent'], //тип правила (при изменении значения от датчика, уставки, режима работы, запускаем алгоритм включения/отключения вентилятора)
  then: function () { //при изменении есть функция 
    
   log('Изменилось значение Vent/controlhim, Vent/sethim, Vent/mode, Vent/hysthim');
    
    if (dev['Vent/mode'] == true) {
    	if ( dev['Vent/controlhim'] > dev['Vent/sethim'] + dev['Vent/hysthim']) { //если влажность с датчика больше уставки + гистерезис
      	dev['wb-modbus-1-0/START'] = true;
        dev['wb-modbus-1-0/SETPOINT'] = 300;
        dev['wb-dac/EXT3_O5'] = 10000;
    	}
    	if (dev['Vent/controlhim'] < dev['Vent/sethim'] - dev['Vent/hysthim']) { //если влажность с датчика меньше уставки - гистерезис
      	dev['wb-modbus-1-0/START'] = false;
        dev['wb-modbus-1-0/SETPOINT'] = 200;
        dev['wb-dac/EXT3_O5'] = 0;
    	}
    }
    else dev['wb-modbus-1-0/START'] = false;
         dev['wb-modbus-1-0/SETPOINT'] = 200;
         dev['wb-dac/EXT3_O5'] = 0;
  }
});

Проблема с температурой датчик
Проблема с температурой


wb-rules_20230821T120230.log (266,9 КБ)
Правило Mod1.txt (4,8 КБ)

Добрый день.
К сожалегнию в логе не вижу ни одного срабатывания строки

 log('Изменилось значение температуры с датчика = {}', newValue);

Правило точно срабатывало?

log_20230822T135222.log (155,2 КБ)
Вот лог, где выбрал все сервисы при загрузке.
При изменении уставок, в логе видно, что изменилось значение, правило работает.

Я говорю про строку 60, где эначение топика Vent/controltemp устанавливается.
Не вижу в логе ее выполнения (соответствующей записи в лог нет).

В чём может быть проблема, как её решить?

Измените значение, возможно опубликуйте его вкучную - и проверьте отрабатывает ли правило.


В mqtt брокере опубликовал значение и температуры и влажности значение 55.
В логе не вижу за 17:32 сообщения, что " ‘Изменилось значение температуры с датчика = {}’, newValue". соответствующее 60 строке кода. Вот лог.
log_20230822T173815.log (41,2 КБ)

А как именно публиковалось? Воспроизвел:

  defineRule('ruleventtemp', {   //правило для температуры
    
  whenChanged: 'wb-mai6_13/IN 6 P Value',  //тип правила (при изменении значения с датчика температуры, отобразить его в контроле, отобразить в логе)
   then: function (newValue, devName, cellName) {
   //dev['Vent/controltemp'] = newValue;
   log('Изменилось значение температуры с датчика = {}', newValue);
    }

  });

Предполагаю при изменении значения в топике получить запись в лог. Получаю

mosquitto_pub  -t "/devices/wb-mai6_13/controls/IN 6 P Value" -m 25 && journalctl -u wb-rules --since "2 sec ago"
-- Journal begins at Thu 2023-05-25 18:16:49 UTC, ends at Tue 2023-08-22 15:16:01 UTC. --
Aug 22 15:16:01 wirenboard-AWI3MCGC wb-rules[1873]: INFO: [rule info] Изменилось значение температуры с датчика = 25

Кстати, обратите внимание, мне кажется немного странной использованная архитектура, когда в одном описании “defineRule”
используется два определения “whenChanged”

Публикую значение через mqtt explorer, там кнопка publish


Упростил скрипт, оставил в одном правиле , одно определение whenChanged. Всё работает!
Вы правы.
Благодарю за помощь, дело было в этом.

1 лайк

Да, проще либо два правила либо включить топик в общее перечисление в whenChanged. Но отдельное проще.

Переписал скрипт и отладил. В итоге получилось так

defineVirtualDevice('Vent', {
    title: 'Вентустановка',
    cells: {
     
      mode: {//режим 0-ручной 1-автомат
        title: 'Режим АВТ',
	    type: 'switch',
	    value: false,
	    },
      settemp: {//уставка
        title: 'Уставка температуры',
	    type: 'range',
	    value: 25,
        min: 0,
        max: 40
	    },
      sethim: {//уставка
        title: 'Уставка влажности',
	    type: 'range',
	    value: 60,
        min: 0,
        max: 80
	    },
      controltemp: {
        title: 'Температура',
        type: 'value',
        units: 'deg C',
        value: 0
        },
      controlhim: {
        title: 'Влажность',
        type: 'value',
        units: '%',
        value: 0
        },
      hysttemp: {
        title: 'Гистерезис температуры',
	    type: 'range',
	    value: 0.5,
        min: 0,
        max: 5
	    },
      hysthim: {
        title: 'Гистерезис влажности',
	    type: 'range',
	    value: 0.5,
        min: 0,
        max: 5
	    },

   },
});
  
 defineRule('gettemp', {   //правило - взять значения температуры
whenChanged: 'wb-mai6_55/IN 6 P Value',  //тип правила (при изменении значения с датчика температуры, отобразить его в контроле, отобразить в логе)
   then: function (newValue, devName, cellName) {
   dev['Vent/controltemp'] = newValue;
   log('Изменилось значение температуры с датчика = {}', newValue);
   },
 });

 defineRule('gethim', {   //правило - взять значения влажности
whenChanged: 'wb-mai6_55/IN 6 N Value',  //тип правила (при изменении значения с датчика ВЛАЖНОСТИ, отобразить его в контроле, отобразить в логе)
   then: function (newValue, devName, cellName) {
   dev['Vent/controlhim'] = newValue;
   log('Изменилось значение влажности с датчика = {}', newValue);
   },
 });
  
     
 defineRule('rulevent', {   //правило вентилятора 
    
  whenChanged: ['wb-mai6_55/IN 6 P Value','wb-mai6_55/IN 6 N Value'],  //тип правила (при изменении значения с датчика температуры, отобразить его в контроле, отобразить в логе)
   then: function () {
   
    if (dev['Vent/mode'] == true) { //Если включен АВТ режим
    	if ((dev['Vent/controlhim'] >= dev['Vent/sethim'] + dev['Vent/hysthim']) || (dev['Vent/controltemp'] >= dev['Vent/settemp'] + dev['Vent/hysttemp'])) { //если температура или влажность датчика больше уставки + гистерезис
      	 dev["wb-modbus-1-0/START"] = true; //включить частотник
         dev['wb-modbus-1-0/SETPOINT'] = 500; //задать частоту 50Гц
         dev['wb-dac/EXT3_O5'] = 10000; //открыть возд клапан (жалюзи) на 100%
         dev['wb-gpio/EXT2_K5'] = false; //выключил увлажнитель 
         dev['wb-gpio/EXT2_K6'] = false; //выключил обогрев 
    	}
     if ((dev['Vent/controlhim'] < dev['Vent/sethim'] - dev['Vent/hysthim']) && (dev['Vent/controltemp'] < dev['Vent/settemp'] - dev['Vent/hysttemp'])) { //если температура и влажность датчика меньше уставки - гистерезис
      	 dev['wb-modbus-1-0/START'] = false; //выключить частотник
         dev['wb-modbus-1-0/SETPOINT'] = 200; //задать частоту 200Гц (по умолчанию будет записана для случая включения вручную)
         dev['wb-dac/EXT3_O5'] = 0; //закрыть возд клапан (жалюзи)
    	}
    }else { // Если режим РУЧ.
      dev['wb-modbus-1-0/SETPOINT'] = 200; // Задать частоту 0Гц (по умолчанию будет записана для случая включения вручную)
    }
    }, //закр функ
 }); //закр правило
1 лайк

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.