Здравствуйте!
помогите с написанием простейшего правила. есть модули ввода module wbio-di-dr-8 и модуль вывода module wbio-do-r3a-8, нужно написать правило для кнопки подключённой к первому входу модуля ввода, при нажатии включалось бы второе реле на модуле вывода. хочется понять как это надо писать. в примерах не нашёл правил на такие модули. и хотелось бы чтобы строки были прокомментированы, так как я ещё только начинаю изучать всю эту систему.
спасибо!
Думаю, с написанием Вы и сами справитесь (по личному опыту), т.к. правила универсальные под все модули, тут пример (см. п. 7. Опишем правила на включение и выключение переключателя), а тут подробное описание команд.
PS. Для меня, каждый раз, написание новых правил, это поднимать документацию с нуля. Да и полагаю Вам сюда.
Спасибо, но всё это я уже прочитал, но у всех задачи разные и никто не дал пример на правило для стыкующихся модулей. здесь получается что либо все уже программисты на линуксе, либо пишут и потом востанавливают всю систему с нуля. как-то хотелось бы более чёткого и подробного описания, с чего начинать, почему именно так и т.д. а получается что многие параметры вообще недокументированы и тогда как это всё искать непонятно! для ликбеза для чайников тут совсем нет инфы. если кто уже в совершенстве освоил написание правил просто киньте код с комментами чтобы понять как это должно быть именно в моей ситуации. буду благодарен тем, кто всё же кинет готовое правило!
Добрый день! может всё-таки кто-нибудь подскажет как включить реле через модуль 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;
}
}
});
но не работает! в чём проблема?
Список названий каналов вы можете посмотреть в разделе Settings.
При разработке правил можно пользоваться функцей log() для вывода отладочной информации.
На глаз: у вас почему-то и EXT1_DR2 и EXT1_R3A1 начинаются на EXT1, так не может быть. Не нужно сочинять и разбираться как эти каналы называются - идите в Settings и копируйте оттуда правильные названия.
Как запустить правило при включении контроллера? мне нужно, чтобы при полной загрузке контроллер выдавал 3 сигнала зумера!
любой скрипт, который вы пишете в движке правил, будет запущен при старте движка правил. Т.е. при старте контроллера.
Просто напишите то, что вы хотите сделать, в теле скрипта, без всяких defineRules.
Вообще это конечно не очень корректно, но так проще всего.
Приветствую
Прошу помощи в написании скрипта для димера светодионых лент 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 секунд.
Приветствую
Подключил датчик протечки к 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);
}
}
});
так а в чём проявляется то, что правило у вас сейчас не работает?
Реле никак не реагирует при срабатывании датчика. То есть вообще никакой реакции
Подскажите, пожалуйста как все-таки быть с включением в один день и отключением на следующий? Так тоже не помогает что-то:
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);
Добрый день, alleon!
А что такое у вас “today” – вы хотели сказать “date_start”?
var date_end = new Date(date_start.getTime() + (24 * 60 * 60 * 1000));
Так все работает:
Оно работает, если date_start и date_end происходит в один день. А мне нужно, чтобы ночной свет включался при движении с 23.00 (например) до 7.00 следующего дня. Вот так не работает. Ищу разные функции, но до сих пор не нашел примера скрипта в безграничном Интернете.
да, забыл. если дальше вот так идет:
if ((date > date_start) && (date < date_end))
Или может быть подскажете, что нужно дописать, чтобы правило работало, например 6 часов после date_start.
А можно, пожалуйста, прислать полный текст правила – я немного не понимаю, о чем идет речь.
Да, конечно. Взят тут: 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, то все работает.
Это вы нам наш же скрипт прислали! А нам ваш нужен.
Я немного не понимаю: условие date_start < date_end и должно выполняться, если это границы интервала, внутри которого все должно работать.
Пока суть да дело, посмотрите на форме: мы обсуждали, как управлять нагрузкой с астрономическими вычислениями захода и восхода солнца, там есть примерчик кода. Может он подойдет вам с доработками под ваши нужды: Пример кода. Вся полезная информация начинается со слов “Смотрите, вот код переписанной библиотеки:”
Там только координаты на местности поменяйте под свои.
При отладке используйте функцию log(); – она вам сильно облегчит понимание того, как все происходит. Вывод ее можно смотреть, нажав на иконку с гечным ключом внизу справа на странице редактирования правила.
Мой почти такой же:
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))
Правильно я понял,
создаю файл 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);
}
}
}
});
поменяв координаты местности на свои
Да, совершенно верно. Библиотека в одном файле .js, а другие скрипты/правила могут вызывать ее функции.