CRON правило

1 Как в CRON в строке назначения времени срабатывания использовать переменные?
Например:
var minu= " variable * * * * * ";

defineRule(‘croneRule’, {

when: cron(minu),
Если я вставляю переменные, то ошибок нет, но и не работает как надо.
2 По работе CRON вопрос:
var minu= " 4 * * * * * ";
defineRule(‘croneRule’, {
when: cron(minu),
then: function () {
dev[‘wb-gpio/EXT1_K1’] = false;
}
У меня реле срабатывает 1 раз в минуту, а не раз в 4 сек. Когда то ранее выставлял 1 мин. Действительно.
Если я заменю var minu= " 4 * * * * * "; на var minu= " * * * * * * ";, то реле срабатывает 1 раз в секунду, как и должно быть. Верну опять 4 и будет срабатывать 1 раз в минуту. Это как так?

Переменные - вряд ли.

А чтобы было “каждые 4 секунды” надо вместо

4 * *...

написать

*/4 * * ...

и почитать мануал на строки CRON (в т.ч., что есть в документации)

var minu = "{} * * * * *".format(variable);

Добрый день!
Передать строку через переменную можно, как отметили выше. Например так:

var sec = 4;
var spec = "*/{} * * * * *".format(sec);

defineRule("cronRule", {
  when: cron(spec),
  then: function () {
    dev["wb-gpio/EXT1_K1"] = false;
  }
});

Или без .format:

var sec = 4;
var spec = "*/" + sec + " * * * * *";

Или вызывать раз в 4 секунды через @every:

defineRule("cronRule", {
  when: cron("@every 4s"),
  then: function () {
    dev["wb-gpio/EXT1_K1"] = false;
  }
});

Но важный нюанс: объект cron() создаётся один раз, в момент загрузки правил. Если вы потом где-то поменяете переменную – уже созданное cron-расписание не обновится.

Если хотите на лету менять расписание, то делайте срабатывание раз в секунду, а внутри then проверяйте условия. Либо используйте таймеры.

1 лайк

Здравствуйте! Удалось ли решить вашу проблему?