Есть ли добрые люди, готовые поделиться примерами скриптов из реальной жизни? Самое простое: реакция на кнопу, напряжение, сопротиление на wiki есть. Пока, как в скрипте “сделать” импульс, счетчик, как хранить какие-нибудь данные, для не программиста не очевидно.
Вот, к примеру, что у меня получилость для управления бистабильным реле:
defineVirtualDevice("water_state", {
title: "Water state", //
cells: {
'Water' : {
type : "text",
value : ""
}
}
});
defineRule("water_on", {
when: function () {
return dev["wb-gpio"]["D2_IN"] == 1;
},
then: function () {
startTimer("TimerA3", 1000);
dev["wb-gpio"]["Relay_1"] = 1;
dev["wb-gpio"]["A3_OUT"] = 1;
dev.water_state["Water"] = "ОТКРЫТА";
}
});
defineRule("water_off", {
when: function () {
return dev["wb-gpio"]["D2_IN"] == 0;
},
then: function () {
startTimer("TimerA3", 1000);
dev["wb-gpio"]["Relay_1"] = 0;
dev["wb-gpio"]["A1_OUT"] = 1;
dev.water_state["Water"] = "ЗАКРЫТА";
}
});
defineRule("water_end_pulse", {
when: function () {
return timers.TimerA3.firing;
},
then: function () {
dev["wb-gpio"]["A1_OUT"] = 0;
dev["wb-gpio"]["A3_OUT"] = 0;
// timers.TimerA3.stop();
}
});
работа с cron.
убедились, что cron работает
ps wax | grep cron
скрипт вкл/выкл реле + log (tail /var/log/messages) по времени
[quote]defineRule(“BoylerON”, {
when: cron(“0 29 6 * *”),
then: function () {
dev[“wb-gpio”][“Relay_2”] = 1;
log(“BoylerON_06:30”);
}
});
defineRule(“BoylerOFF”, {
when: cron(“0 45 7 * *”),
then: function () {
dev[“wb-gpio”][“Relay_2”] = 0;
log(“BoylerOFF_7:45:00”);
}
});
[/quote]
Может у кого есть скрипт для реализации подсчёта импульсов, покажите пример пожалуйста!
А с чего вы считать импульсы собираетесь? Если с входов контроллера, то это делается не скриптами, а настройками wb-homa-gpio.conf
грубо говоря считать количество нажатий на кнопку, и сухой контакт, и вывод контроллера (atmega) открытый коллектор
А к Wiren Board это как подключено? К каким портам?
Сейчас к D1-D4, но для меня не принципиально. Просто необходимо реализовать для заказчика подсчёт сессий работы станка, а как считать - не понимаю.
На атмеге элементарно, но с графиками тяжелее. На WB Ваши последние обновления как раз кстати, но как счётчик сделать?
Вам лучше всего настроить wb-homa-gpio через wb-homa-gpio.conf на этих входах в режим подсчёта импульсов. Это описано в документации https://github.com/contactless/wb-homa-drivers/blob/master/wb-homa-gpio/README.md
.
Там это сделано для счётчиков воды или электричества, но если вы поставите множитель 1, то увидите там прямо сырое число импульсов. Драйвер использует аппаратные прерывания, устранение дребезжания и т.п., в общем работает весьма умно. Это гораздо лучше и быстрее, чем реализовывать в системе правил.
Спасибо!
Реализовал на примере изменения состояния переключателя. Считаем до 3-х. Переменая нигде не описана, после перезагрузки а=0.
//
defineVirtualDevice("counter_state", {
title: "CounterState", //
cells: {
'Count' : {
type : "text",
value : ""
}
}
});
//var a = 0; //
defineRule("counter", {
when: function () {
return dev["wb-gpio"]["D1_OUT"] == 1;
},
then: function() {
a = a + 1;
dev["counter_state"]["Count"] = a ;
log(a);
if (a == 3){
log("reset counter",a);
a = 0;
}
}
)};
в логах
В связи с блекаутами в Крыму появилась необходимость отключать WB по разряду АКБ
defineRule("power_low", {
when: function () {
return dev["power_status"]["Vin"] <= 10.6;
},
then: function () {
log("Voltage lower than 10.6V. System is shutdown.");
runShellCommand("halt");
}
});
так заработал cron:
defineRule("BoylerON", {
when: cron("0 29 6 * *"),
then: function () {
dev["wb-gpio"]["Relay_2"] = 1;
log("BoylerON_06:30");
}
});
defineRule("BoylerOFF", {
when: cron("0 30 21 * *"),
then: function () {
dev["wb-gpio"]["Relay_2"] = 0;
log("BoylerOFF_21:30");
}
});
defineRule("BoylerON1", {
when: cron("0 35 18 * *"),
then: function () {
dev["wb-gpio"]["Relay_2"] = 1;
log("BoylerON1_18:35:00");
}
});
defineRule("BoylerOFF1", {
when: cron("0 05 8 * *"),
then: function () {
dev["wb-gpio"]["Relay_2"] = 0;
log("BoylerOFF1_8:05:00");
}
});
Добавили в примеры правило для управления роллетами. В правилах используются замыкания для изоляции названий переменных, таймеры, а также alias-ы.
Ткните пожалуйста пальцем, где это в правиле. Или может где почитать. Вообще, подумалость, было бы поучительно получить хотя-бы начальные понятия для облегчения написаний правил …или может не написаний, а как в skratch - кубики составлять
Речь про вот это: http://blog.mgechev.com/2012/08/29/self-invoking-functions-in-javascript-or-immediately-invoked-function-expression/
т.е. весь код целиком оборачивается в
(function(){{
вот тут весь код
})()
В правиле это превая и последняя строчка.
Нужно это для того, чтобы переменные не были видны в других скриптах.
Это не обязательно, если вы следите за названиями переменных.
Когда-нибудь мы сделаем изоляцию файлов друг от друга из коробки, но пока - так.
BTW: движок правил не зависит от системного cron, у него своя реализация, так что проверка сервиса cron здесь не обязательна.
Сообщение перенесено в тему Вопрос по 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);
}
}
});