Помогите разобраться с написанием Правила

Здравствуйте. Помогите разобраться. Принцип действия скрипта: Есть кнопка-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, “Тема письма”, “Текст письма”);” не чего не отправляет.
В чем может быть проблема?

Этот пользователь и пароль точно существует?
Да, пароли когда создадите-установите сюда лучше не выкладывать.

Да существуют. Они верные.

Screenshot from 2020-08-14 12-47-58
Думаю пароль все же не тот.
Ну и прочие настройки - именно под 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 на другое имя письма не уходят.