Примеры скриптов

Добавили в примеры правило для управления роллетами. В правилах используются замыкания для изоляции названий переменных, таймеры, а также alias-ы.

http://contactless.ru/wiki/index.php/Движок_правил_wb-rules#.D0.A0.D0.BE.D0.BB.D0.BB.D0.B5.D1.82.D1.8B

Ткните пожалуйста пальцем, где это в правиле. Или может где почитать. Вообще, подумалость, было бы поучительно получить хотя-бы начальные понятия для облегчения написаний правил …или может не написаний, а как в skratch - кубики составлять

Речь про вот это: http://blog.mgechev.com/2012/08/29/self-invoking-functions-in-javascript-or-immediately-invoked-function-expression/

т.е. весь код целиком оборачивается в

(function(){{  
     вот тут весь код
})()

В правиле это превая и последняя строчка.

Нужно это для того, чтобы переменные не были видны в других скриптах.

Это не обязательно, если вы следите за названиями переменных.

Когда-нибудь мы сделаем изоляцию файлов друг от друга из коробки, но пока - так.

1 Like

BTW: движок правил не зависит от системного cron, у него своя реализация, так что проверка сервиса cron здесь не обязательна.

Сообщение перенесено в новую тему: Вопрос по paho mqtt

Сообщение перенесено в тему Вопрос по paho mqtt

Скажите, а где спрашивать про написание скриптов?
Если здесь, то вопрос - как модифицировать пример скрипта - при возникновении флажка на сенсоре, начать
отсчет таймера, если флажок обнуляется, то таймер отключается. Если таймер истекает и флажк =1 , то выполнение действий. спасибо!

var motion_timer_1_timeout_ms = 50 * 1000;
var motion_timer_1_id = null;

defineRule("motion_detector_2", {
  whenChanged: "astra_1_sensor_2/Channel1",
    
  then: function (newValue, devName, cellName) {
    if (newValue) {
       //dev["wb-mr14_10"]["K12"]=1;
        	if (motion_timer_1_id) {
              clearTimeout(motion_timer_1_id);
       }
      
        motion_timer_1_id = setTimeout(function () {
   	//	   dev["wb-mr14_10"]["K12"]=0;
         motion_timer_1_id = null;   
      }, motion_timer_1_timeout_ms);           	
    }
   }
});

Здравствуйте!

сделайте так:
if (dev[“astra_1_sensor_2”][“Channel1”] ==1) //если вход активирован запустить таймер
if (dev[“astra_1_sensor_2”][“Channel1”] ==0) //если деактивирован остановить, т.е. очистить таймер если он был запущен.

1 Like

спасибо. оттестировал… поможите с оператором
каким оператором сбрасывается таймер? Clear timeout - его обнуляет… где это почитать-то

var Income_timer_1_timeout_ms = 200 * 1000;
var Income_timer_1_id = null;

defineRule("motion_detector_3", {
  whenChanged: "astra_1_sensor_3/Channel1",
    
  then: function (newValue, devName, cellName) {
   if (newValue) {
   
     if (dev["astra_1_sensor3"]["Channel1"] ==1) 
      {
        dev["wb-mr14_10"]["K12"]=1;
          var date= new Date(); 
             var strDate= date.toString();
          runShellCommand("curl -s -X POST https://api.telegram.org text='Incomming light now is ON - "+strDate+"'");
          date = null; 
        strDate=null;
     
         	if (Income_timer_1_id) {
              clearTimeout(Income_timer_1_id);
       }
        
        Income_timer_1_id = setTimeout(function () {
   		   dev["wb-mr14_10"]["K12"]=0;
     var date= new Date(); 
         var strDate= date.toString();
              runShellCommand("curl -s -X POST https://api.telegram.org/ text='Incomming light now is OFF -"+strDate+"'");
         Income_timer_1_id = null;   
      }, Income_timer_1_timeout_ms); 
    } //if
     
    if (dev["astra_1_sensor3"]["Channel1"] == 0)
      
    {
        
      // Что сюда вставить
               	
    }
   }
});

Добрый день!

мне кажется это лишнее. вы же конкретно указываете изменение т.е. ==1 или ==0. а там меняется каждый раз при изменении на входе. про обнуление таймера не скажу. сам когда-то пытался получить ответ на этот вопрос. на get hab в правилах что-то есть, но объясняется плохо.

1 Like

да спасибо. все получилось. мелочи портили скрипт. срабатывал неправильно.

подскажите как обьявить глобальную функцию для всех скриптов? для второй версии понятно через require, а для первой?

создал /wb-rules js файл с фунциями. подхватилось. правильно ли я сделал?

В первой версии wb-rules общее пространство у всех скриптов. т.е. можно разместить функцию/переменную в любом скрипте. При этом нужно помнить, что нельзя использовать разные глобальные переменные (функции) с одним именем в разных скриптах

ok. спасибо.

Здравствуйте .
Пробую написать правило для последовательного включения (через заданный интервал) реле по команде (из виртуального переключателя)
Не совсем понял как это возможно сделать в рамках одного правила .
Если обрабатывать команду и состояние предыдущего реле через обработчик AsSoonAs то все теоретически должно работать .
Не понятно, как оформить это действие в одно правило ?

Добрый день!
Самое простое, что приходит в голову, это описать несколько функций, включающих разные реле:

   function relay1On() {dev["wb-mr11_111"]["K1"]=true; log('Relay 1 On');}
   function relay2On() {dev["wb-mr11_111"]["K2"]=true; log('Relay 2 On');}
   function relay3On() {dev["wb-mr11_111"]["K3"]=true; log('Relay 3 On');}

А дальше в обработчике правила в секции then: вызывать их с нужной задержкой:

  setTimeout(relay1On, 1000);
  setTimeout(relay2On, 2000);
  setTimeout(relay3On, 3000);

спасибо . буду пробовать

Дополню, что можно писать анонимные функции:

setTimeout(function() { dev["wb-mr11_111/K1"]=true; }, 1000);

Если кому интересно, то можно задать вирт. устройство произвольно из скрипта.

Логика проста.
Задаем массив объектов, которые хотим передать в вирт. устройство. Например:

[
{source_dev:"T3HLS-1/Temperature", target_dev:"Temperature1",modify_mode:"Kelvins"},
{source_dev:"T3HLS-1/External_Sensor_1", target_dev:"Temperature2",modify_mode:"Kelvins"},
{source_dev:"T3HLS-1/External_Sensor_2", target_dev:"Temperature3",modify_mode:"Kelvins"},
{source_dev:"T3HLS-1/Humidity", target_dev:"Humidity",modify_mode:"Round(x)"},
{source_dev:"T3HLS-1/Illuminance", target_dev:"Illuminance",modify_mode:"Round(xHyst2)"},
{source_dev:"T3HLS-1/Sound_Level", target_dev:"Sound_Level",modify_mode:"Round(xHyst2)"},
{source_dev:"T3HLS-1/Input_Voltage", target_dev:"Input_Voltage",modify_mode:"Round(x)"}
]);

затем обрабатываем этот массив, вынимая нужные поля и расставляя их в новом объекте полей (cells)

for (var i=0; i<this.SETTINGS.length;i++){
				
		log("отрабатываем cell " + i);
				
		cells[this.SETTINGS[i].target_dev] = {
			type:"string",
			value:"NA"
		}
	};

Ключевой для меня была конструкция cells[this.SETTINGS[i].target_dev]. Размещение переменной в квадратных скобках дает возможность создать поле с именем этой переменной.

ну и венец всему:

defineVirtualDevice(obj_name,{
				title: obj_name,
				cells:cells 
	});
3 Likes

Правильно я понимаю, что переменную SETTINGS нужно задать как

var SETTINGS = readConfig("/etc/settings.conf");

?

нет, SETTINGS - это массив, который я вношу как список полей.

[
{source_dev:"T3HL

и т.д.