Помогите с написанием правил!


#1

Здравствуйте!
помогите с написанием простейшего правила. есть модули ввода module wbio-di-dr-8 и модуль вывода module wbio-do-r3a-8, нужно написать правило для кнопки подключённой к первому входу модуля ввода, при нажатии включалось бы второе реле на модуле вывода. хочется понять как это надо писать. в примерах не нашёл правил на такие модули. и хотелось бы чтобы строки были прокомментированы, так как я ещё только начинаю изучать всю эту систему.
спасибо!


#2

Думаю, с написанием Вы и сами справитесь (по личному опыту), т.к. правила универсальные под все модули, тут пример (см. п. 7. Опишем правила на включение и выключение переключателя), а тут подробное описание команд.
PS. Для меня, каждый раз, написание новых правил, это поднимать документацию с нуля. Да и полагаю Вам сюда.


#3

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


#4

Добрый день! может всё-таки кто-нибудь подскажет как включить реле через модуль wbio-di-dr-8? написал вот такое правило:
defineRule(“proverka”, {
whenChanged: “wb-gpio/EXT1_DR2”,
then: function (newValue, devName, cellName)
{
if (newValue)
{
dev[“wb-gpio”][“EXT1_R3A1”] = newValue;
dev[“wb-gpio”][“EXT1_R3A2”] = newValue;
}
}
});

но не работает! в чём проблема?


#5

Список названий каналов вы можете посмотреть в разделе Settings.
При разработке правил можно пользоваться функцей log() для вывода отладочной информации.

На глаз: у вас почему-то и EXT1_DR2 и EXT1_R3A1 начинаются на EXT1, так не может быть. Не нужно сочинять и разбираться как эти каналы называются - идите в Settings и копируйте оттуда правильные названия.


#6

Как запустить правило при включении контроллера? мне нужно, чтобы при полной загрузке контроллер выдавал 3 сигнала зумера!


#7

любой скрипт, который вы пишете в движке правил, будет запущен при старте движка правил. Т.е. при старте контроллера.

Просто напишите то, что вы хотите сделать, в теле скрипта, без всяких defineRules.

Вообще это конечно не очень корректно, но так проще всего.


#8

Приветствую

Прошу помощи в написании скрипта для димера светодионых лент WB-RGB.
Сейчас имею костыльный способ плавного уменьшения и увеличения яркости по расписанию путем написания нехитрого кода, который приходится много раз дублировать для увеличения/уменьшения яркости:

defineRule("Sunset1", {
    when: cron("0 40 23 * *"),
    then: function() {
        dev["wb-mrgb_123"]["RGB"] = '182;38;50';
    }
});

defineRule("Sunset2", {
    when: cron("0 42 23 * *"),
    then: function() {
        dev["wb-mrgb_123"]["RGB"] = '145;20;41';
    }
});

При этом данный способ плох вот чем. Например, днем свет постоянно работает и по расписанию в 23:40 начинается плавное (дискретное, из за выполнения указанного выше кода) уменьшение яркости. А мне захотелось выключить свет раньше, например я пошел спать в 23:00, в этом случае начиная с 23:40 свет опять же включится и начнется его уменьшение.

Как бы сделать так, чтобы правило уменьшало яркость димера начиная с текущего значения, а не с заданного в правиле? То есть подходит время убавления яркости и правило начинает вычитать из текущего значения, например 255 по 5 единиц в 10 секунд.


#9

Приветствую

Подключил датчик протечки к WB-MCM16. При подаче сигнала от датчика в веб-интерфейсе вижу отображение сигнала на WB-MCM16. Таким образом физическое подключение корректно.
Не получается написать корректный скрипт по управлению реле при поступлении сигнала от датчика протечки.
Подскажите, что требуется изменить/дописать, чтобы правило работало?

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

defineRule("water_control", {
    whenChanged: "WB-MCM16_173/Input 16",
    then: function(newValue, devName, cellName) {
        if (newValue) {
            dev["WB-MR14_147"]["K9"] = 1;

            if (motion_timer_1_id) {
                clearTimeout(motion_timer_1_id);
            }

            motion_timer_1_id = setTimeout(function() {
                dev["WB-MR14_147"]["K9"] = 0;
                motion_timer_1_id = null;
            }, motion_timer_1_timeout_ms);
        }
    }
});

#10

так а в чём проявляется то, что правило у вас сейчас не работает?


#11

Реле никак не реагирует при срабатывании датчика. То есть вообще никакой реакции


#12

Подскажите, пожалуйста как все-таки быть с включением в один день и отключением на следующий? Так тоже не помогает что-то:

     then: function () {
var date = new Date();
var date_start = new Date(date);
var date_end = new Date(today.getTime() + (24 * 60 * 60 * 1000));

date_start.setHours(23);
date_start.setMinutes(00);

date_end.setHours(06);
date_end.setMinutes(30);

#13

Добрый день, alleon!
А что такое у вас “today” – вы хотели сказать “date_start”?

var date_end = new Date(date_start.getTime() + (24 * 60 * 60 * 1000));

Так все работает:


#14

Оно работает, если date_start и date_end происходит в один день. А мне нужно, чтобы ночной свет включался при движении с 23.00 (например) до 7.00 следующего дня. Вот так не работает. Ищу разные функции, но до сих пор не нашел примера скрипта в безграничном Интернете.
да, забыл. если дальше вот так идет:
if ((date > date_start) && (date < date_end))
Или может быть подскажете, что нужно дописать, чтобы правило работало, например 6 часов после date_start.


#15

А можно, пожалуйста, прислать полный текст правила – я немного не понимаю, о чем идет речь.


#16

Да, конечно. Взят тут: http://wirenboard.ru/wiki/index.php/Движок_правил_wb-rules

var motion_timer_1_timeout_ms = 5 * 1000;
var motion_timer_1_id = null;
 
defineRule("motion_detector_1", {
  whenChanged: "wb-gpio/A1_IN",
  then: function (newValue, devName, cellName) {
    var date = new Date();

    // time point marking the beginning of the interval
    // i.e. "today, at HH:MM". All dates are in UTC!
    var date_start = new Date(date);
    date_start.setHours(9);
    date_start.setMinutes(30);

    // time point marking the end of the interval
    var date_end = new Date(date);
    date_end.setHours(17);
    date_end.setMinutes(10);
    
    // if time is between 09:30 and 17:10 UTC
    if ((date > date_start) && (date < date_end)) {
      if (newValue) {
          dev["wb-gpio"]["EXT1_R3A1"] = 1;
   
          if (motion_timer_1_id) {
            clearTimeout(motion_timer_1_id);
         }
   
          motion_timer_1_id = setTimeout(function () {
             dev["wb-gpio"]["EXT1_R3A1"] = 0;            
             motion_timer_1_id = null;
          }, motion_timer_1_timeout_ms);              
      }
     }
   }
});

При чем, если date_start < date_end, то все работает.


#17

Это вы нам наш же скрипт прислали! А нам ваш нужен.

Я немного не понимаю: условие date_start < date_end и должно выполняться, если это границы интервала, внутри которого все должно работать.

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

Там только координаты на местности поменяйте под свои.

При отладке используйте функцию log(); – она вам сильно облегчит понимание того, как все происходит. Вывод ее можно смотреть, нажав на иконку с гечным ключом внизу справа на странице редактирования правила.


#18

Мой почти такой же:
var motion_timer_1_timeout_ms = 15 * 1000;
var motion_timer_1_id = null;

    defineRule("night_light", {
      whenChanged: "hs24bits_114844_114844/state",
      then: function (newValue, devName, cellName) {
        var date = new Date();
     
        // time point marking the beginning of the interval
        // i.e. "today, at HH:MM". All dates are in UTC!
        var date_start = new Date(date);
        date_start.setHours(0);
        date_start.setMinutes(01);
     
        // time point marking the end of the interval
        var date_end = new Date(date);
        date_end.setHours(7);
        date_end.setMinutes(30);
     
        // if time is between 00:01 and 07:00 UTC
        if ((date > date_start) && (date < date_end)) {
        if (dev["hs24bits_114844_114844"]["state"] == 1) {
              dev["wb-gpio"]["EXT3_HS1"] = 1;
     
              if (motion_timer_1_id) {
                clearTimeout(motion_timer_1_id);
             }
     
              motion_timer_1_id = setTimeout(function () {
                 dev["wb-gpio"]["EXT3_HS1"] = 0;            
              }, motion_timer_1_timeout_ms);              
          }
         }
       }
    });

Вот так скрипт работает. Но если установить date_start.setHours(23), то работать ничего не будет. Насколько я понимаю, из-за того что:
if ((date > date_start) && (date < date_end))


#19

Правильно я понял,
создаю файл sun.js с кодом переписанной библиотеки, сохраняю его в скриптах и далее создаю свой скрипт:

var motion_timer_1_timeout_ms = 15 * 1000;
var motion_timer_1_id = null;
 
defineRule("night_light", {
  whenChanged: "hs24bits_114844_114844/state",
  then: function (newValue, devName, cellName) {
    var lat = 55.75;
    var lng = 37.51; 
    var date = new Date();
    now = new Date(); 
	//now = new Date("2017-01-20 23:22:30.719+03:00"); 
	log ("Заданная дата\t", now);
	log ("Восход\t\t", sunrise);
	log ("Закат\t\t", sunset);

    var sunrise = SunCalc.getRise(date, lat, lng);
    var sunset  = SunCalc.getSet(date, lat, lng);

    // if time is between from sunset to sunrise
    if ((now > sunset) && (now < sunrise)) {
    if (dev["hs24bits_114844_114844"]["state"] == 1) {
          dev["wb-gpio"]["EXT3_HS1"] = 1;
 
          if (motion_timer_1_id) {
            clearTimeout(motion_timer_1_id);
         }
 
          motion_timer_1_id = setTimeout(function () {
             dev["wb-gpio"]["EXT3_HS1"] = 0;            
          }, motion_timer_1_timeout_ms);              
      }
     }
   }
});

поменяв координаты местности на свои


#20

Да, совершенно верно. Библиотека в одном файле .js, а другие скрипты/правила могут вызывать ее функции.