Движок правил: примеры кода

Здравствуйте. Выставил часовой пояс на контроллере. date теперь показывает Tue Nov 21 12:36:07 MSK 2017 - правильное время. Но правило, определенное для крон с указанием времени работает только для времени UTC.

defineRule("cron_0911", {
    when: cron("0 10 9 * * *"),
    then: function () {
        log("cron");
        if (dev["drb88_9"]["Relay 1"]) {
            dev["drb88_9"]["Relay 1"] = 0;
        } else {
            dev["drb88_9"]["Relay 1"] = 1;
        }
    }
});

Это правило сработает в 12:10 по Московскому времени. Так и должно быть?

И замечание. У вас в документации написано “Вместо @hourly здесь можно задать любое выражение, допустимое в стандартном crontab, например, 0 20 * * * (выполнять правило каждый день в 20:00).”
Но это не так, первый символ это секунды, а не минуты. И об этом написано по ссылке, которая у вас в тексте.

Как правильно создать defineVirtualDevice с типом integer или float?
Чтоб, например, передавать значения типа колограмм…

1 лайк

Люди добрый помогите пожалуйста непрограммисту составить шаблоны правил для следующих задач, которые будут востребованы в 100% случаях при использовании WB в домашней автоматизации:

  1. Управление несколькими реле по изменению счетчика dev["device/Input "x" counter с предварительной проверкой состояния реле (если хотя бы одно реле On, то выкл все. если все off то вкл все.
  2. Аналогичное, но с добавлением в правило каналов диммера.
  3. Обработка двойного нажатия для определенного ```dev["device/Input “x” counter``. Т.е. запуск таймера после n+1, далее ожидание n+2, далее сброс таймера, анализ n и выполнение разных функций для n+1 и для n+2.
  4. Правило для постановки на сигнализацию определенных dev["device/Input "x" при отработке определенной функции, а также оповещение при сработке входа.
  5. Различные правила для ```dev["device/Input “x” counter` в зависимости от времени суток.
  6. Создание многонаборных сценариев, для виртуальных устройств: напр. включение димера на 20%+включение реле1+ реле5+ температура пола 26.
  7. Настройка алиасов для входных каналов : например вместо ```dev["device/Input “x”] применять одну глобальную переменную “button1”.
  8. То же самое для каналов реле - тут сложности: как система поймет что алиас “rele1” в одном случае это dev[device/K1], а в другом dev[device][K1]
  9. Как правильно структурировать правила - вкладывать все обработки в одну функцию (проверка времени суток, проверка состояния, проверка количества нажатий" или лучше разносить обработки в разных функциях, тогда какие должны выполняться раньше?
  10. будут дополняться

p.s. простое изложение данных шаблонов увеличит количество желающих приобрести Ваше оборудование. Возможно стоит выделить отдельную тему и назвать ее типа “Умный дом на WB для чайников”)))))

Может кто возьмется за плату составить шаблоны на выше указанные задачи?

5 сообщений перенесены в новую тему: Правило на групповое управление светом

Добрый вечер. Подскажите, как использовать переменные с восходом и закатом. Как сделать так, чтобы при наступлении восхода или заката сработало реле, которое выключает/включает уличное освещение. У меня, на данный момент, скрипт срабатывает только при обновлении или сохранении файла правила

Добрый день!
пытаюсь расположить функцию в отдельном js-файле, а ее вызов в другом и получаю ошибку:

Script error: ReferenceError: identifier ‘onButtonPress’ undefined
duk_js_var.c:1232
anon /etc/wb-rules/light_switches.js:42 preventsyield

нужно как-то специально указывать что функция расположена в другом файле?

И еще вопрос: при вызове функции, например, с параметром longPress, как передать несколько устройств (нужно по долгому нажатию выключать несколько реле)? и как задать какое значение должно принять реле (true/false)?

Спасибо!

Рекомендую сразу перейти на Новая версия движка правил и прочитать
Движок правил wb-rules — Wiren Board

как понять какая версия движка установлена?

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

@almo
и все-таки, как корректно указать что нужно выключить несколько устройств при долгом нажатии?

выполнить в консоли
dpkg -s wb-rules

Спасибо большое, разобрался!
Но возникает одна странная ошибкаЖ

Цитата
Script error: ReferenceError: identifier ‘ActionButtons’ undefined
duk_js_var.c:1232
anon /etc/wb-rules/light_switches.js:30 preventsyield

если перезагрузить WB или сервис движка правил.
Соответственно и правила не работают, пока не зайдешь в правило и не пересохранишь его.

С чем такое может быть связано и как это исправить?

Не хочется делать костылей по автоматическому пересохранению правила после перезагрузки…

А что у вас оказалось на 30-й строчке файла light_switches.js, и около него?
Можете просто весь итоговый файл выложить.

light_switches.js.txt (4.4 КБ)
Вот весь файл, там много всего лишнего…
ругается на строку:

Цитата
ActionButtons.onButtonPress(

при этом если пересохранить, то перестает ругаться

А ещё файл с описанием объекта ActionButtons сбросьте, пожалуйста

вот он onButtonPress.js.txt (5.2 КБ)

Здравствуйте! Помогите пожалуйста написать правильно скрипт. Вообщем ситуация такая,есть кнопка для управления вентилятором (вентилятор с регулировкой оборотов-работает через аналоговый выход 0-10v) она его включает при первом нажатии на 100% при втором на 50% и при третьем выключает это реализовать удалось. Также вентилятор должен работать от датчика влажности при превышении порога включается на 50% и по истечении какого то времени включается на 100% .Выключается при снижении порога и сбрасывает таймер .Если произошло включение по кнопке сценарий с датчиком работать не должен.Сейчас работает по другому(от датчика влажности вкл на 50% потом по времени на 100% сбрасывает сброс таймера и все по новой) помогите подкорректировать.

(function() { 
  var button_counter = 0;


  defineRule( "on_fan_button", {
    whenChanged: "wb-gpio/A1_IN",
    then: function (newValue, devName, cellName) {

      // если поймали нажатие, увеличиваем счётчик
      if (newValue) {
        button_counter += 1;
      }
       // счётчик равен одному, значит было одинарное нажатие
      if (button_counter == 1) {
        log("fan 100%");dev["wb-dac/EXT2_O1"] = 10000;
      }
      
      // счётчик равен двум, значит было двойное нажатие
      if (button_counter == 2) {
        log("fan 50%");dev["wb-dac/EXT2_O1"] = 5000;
      }
       if (button_counter == 3) {
        log("fan off");dev["wb-dac/EXT2_O1"] = 0;
      }
      // сброс счетчика
     if (button_counter == 3) {
        log("clear counter!",button_counter);button_counter = 0;
      }
    }
      });
  })();
          var Hum = 10;
       var motion_timer_1_timeout_ms = 10 * 1000;
        var motion_timer_1_id = null;
  
   defineRule("Hum_fan_on", { 
   whenChanged: "T2 Bathroom/Humidity", 

   then: function (newValue, devName, cellName) { 
 if ( newValue > Hum) {
  dev["wb-dac/EXT2_O1"] = 5000;  
  
if (motion_timer_1_id) {
      clearTimeout(motion_timer_1_id);
   }
  
    motion_timer_1_id = setTimeout(function () {
	   dev["wb-dac"]["EXT2_O1"] = 10000;         
               motion_timer_1_id = null;   
   	}, motion_timer_1_timeout_ms);           	
}
}
});

Судя по ошибке объект ActionButtons не существует на момент запуска скрипта light_switches. В качестве эксперимента: попробуйте переименовать onButtonPress.js в _onButtonPress.js или что-то подобное, чтобы по порядку он был выше light_switches.

2 лайка

Спасибо!
Это помогло!

2 сообщения было перемещено в эту тему: Новая версия движка правил

Всем здравствуйте!! Помогите пожалуйста написать правильно скрипт. Логика такая есть теплый пол он включается ы выключается по датчику температуры регулируется через виртуальный ползунок. Так же есть виртуальная кнопка когда на ней единица, все должно работать от датчика температуры, когда ноль все должно быть выключено и на датчик температуры реакции не должно быть. Вообщем кнопка должна разрешать работать ТП от датчика температуры или нет.

  defineVirtualDevice("Tp1", {
  title:"Регулятор температуры Пола в прихожей",
  cells: {
  "temperature": {
  type:"range",
  value: 25,
  max: 55
 },"Zima1": {
  type:"switch",
  value: 0,
 }
                }
                });
defineRule("Tpf1", {
whenChanged: "wb-w1/28-00000b785146",
then: function (newValue, devName, cellName) {
if (newValue>dev["Tp1/temperature"]) {
dev["wb-gpio/EXT1_HS5"] = 0;log("Выключение обогревателя 
 ТП1");
} else  
  dev["wb-gpio"]["EXT1_HS5"] = 1;log("Включение 
обогревателя ТП1");    
}
 });