Здравствуйте. Помогите разобраться. Принцип действия скрипта: Есть кнопка-1 и кнопка-2 которые нужно нажимать как загорится лампочка-1. Время загорания лампочки хаотичное, но в интервале от 10 минут до 30 минут. После загорания лампочки дается дополнительно секунд 30 если нажали то всё повторяется, а если не успели нажать загорается лампочка-2 и отправляется сообщение в log. Как лучше это реализовать ?
Добрый день. А в чем именно возникает проблема?
Нашел примеры когда таймер определен однозначно. А как задать произвольный таймер из диапазона времени ? И как сделать защиту от залипания Кнопки-1?
var motion_timer_1_timeout_ms = 30 * 1000;
var motion_timer_1_id = null;
defineRule("motion_detector_1", {
whenChanged: "wb-gpio/D2_IN",
then: function (newValue, devName, cellName) {
if (newValue) {
dev["wb-gpio"]["Relay_1"] = true;
if (motion_timer_1_id) {
clearTimeout(motion_timer_1_id);
}
} else {
motion_timer_1_id = setTimeout(function () {
dev["wb-gpio"]["Relay_1"] = false;
motion_timer_1_id = null;
}, motion_timer_1_timeout_ms);
}
},
});
Набросаю сейчас пример. Сложного - ничего.
Событие возникает только при изменении состояния, так что защита не нужна, можно обрабатывать только нажатие.
//rndtimer.js
var timer_1_constant = 5 * 60 * 1000; //"постоянная" часть значения таймера в миллисекундах
var timer_1_var = 60000; //"Переменная" часть значения таймера в миллисекундах
var timer_2_var = 30 * 1000; //значение (постоянное второго таймера
var buttFlag = false; // Переменная для определения состояния (надо нажать!)
timerBigstart(); // Устанавливаем переменную часть и запускаем таймер
var buttonDevice = "wb-mio-gpio_157:2/IN14"; //Определяем устройство-кнопку
var lamp_dev = "wb-mio-gpio_157:1/K2"; //Определяем устройство-лампу
defineRule("Button_Press", {
whenChanged: buttonDevice,
then: function (newValue, devName, cellName) {
if (newValue){ //Только НАЖАТИЕ
if (buttFlag) { //Если нажато при поднятом флаге (норма)
log.info("Button_Press right!");
dev[lamp_dev] = false; //тушим лампу
buttFlag = false; //опускаем флаг
}else{
log.info("Alarm! Button wrong press!"); //Нажато не вовремя (при потушенной лампе)
}
}
}
});
function timerBigstart(){
//запускает однократный таймер с указанным именем. Значение - сумма timer_1_constant и timer_1_var*случайное число
startTimer("bigTimer", timer_1_constant + timer_1_var * Math.random());
}
defineRule("bigTimer_Firing", {
when: function () { return timers.bigTimer.firing; },
then: function () {
//log.info("bigTimer_Firing");
startTimer("smallTimer", timer_2_var); //запускает однократный таймер с указанным именем.Время в миллисекундах.
dev[lamp_dev] = true; //Включаем лампу
buttFlag = true; //Поднимаем флаг
}
});
defineRule("smallTimer_Firing", {
when: function () { return timers.smallTimer.firing; },
then: function () {
//log.info("smallTimer_Firing");
timerBigstart();
dev[lamp_dev] = false;
if (buttFlag){ //Если кнопка НЕ была нажата
log.info("Alarm! Button don't press!"); // Не нажата совсем
buttFlag = false; //Опускаем флаг
}
}
});
Вот как пример. Прошу обратить внимание - значения в миллисекундах!
Ну, я думаю по образцу можно дописать. Насчет “кнопка-2” - не описано.
Понятно. Спасибо.
Не могу понять, когда скрипт отработал и у нас вышло сообшение “log.info(“Alarm! Button don’t press!”); // Не нажата совсем” почему без всяких действий со стороны кнопки скрипт начинается
с начало? То есть тухнет лампа и начинает работать таймер.
Думаю потому что строчка
//log.info("smallTimer_Firing");
timerBigstart();
А именно “timerBigstart();” снова его запускает.
Закомментируйте и будет отрабатывать только 1 раз.
Закоментировал как вы сказали. Всё стало работать верно.
Возможно у вас уточнить по поводу отправки email из скрипта?
В файле /etc/ssmtp/ssmtp.conf закоментировал все строки “#” и прописал как у вас в инструкции
mailhub:465=smtp.mail.ru
AuthUser=test123@mail.ru
AuthPass=qwerty
UseTLS=Yes
UseSTARTTLS=Yes
При отправке сообщения из консоли “echo ‘Test message to check sSMTP new configuration’ | ssmtp ivanov@gmail.com” долго думает и по таймауту выдает сообщение “ssmtp: Cannot open smtp.mail.ru:465”.
пробовал в скрипте писать “Notify.sendEmail(email, “Тема письма”, “Текст письма”);” не чего не отправляет.
В чем может быть проблема?
Этот пользователь и пароль точно существует?
Да, пароли когда создадите-установите сюда лучше не выкладывать.
Да существуют. Они верные.
Думаю пароль все же не тот.
Ну и прочие настройки - именно под mail советую “обкатать” настроив почтовую программу на компьютере.
Вот эту строчку - вообще не понимаю.
Предполагаю mailhub=smtp.mail.ru:465
При копировании что то съехало… написано как вы сказали mailhub=smtp.mail.ru:465
на счёт логина и пароля не понял… Выкладывать или нет?
AuthUser=test123@mail.ru
AuthPass=qwerty
это я для примера написал…
НЕТ!
Верный конфиг для mail.ru:
mailhub=smtp.mail.ru:465
FromLineOverride=YES
UseTLS=Yes
AuthUser=wb@mail.ru
AuthPass=*xxxxxx*
Обязательно пустая строчка ПОСЛЕ AuthPass=
и в файле /etc/ssmtp/revaliases строчку
root:wb@mail.ru:smtp.mail.ru:465
И для теста
echo 'Test message to check sSMTP new configuration' | ssmtp -v USER@mail.ru
Получилось?
Получилось. С новыми настройками письма стали уходить. Спасибо.
А возможно как то изменить имя отправителя письма? Сейчас когда приходит письмо то в отправители значиться “root”, а если меняешь root на другое имя письма не уходят.