Не работает disableRule()

Пытаюсь понять возможности управления работой правил.

Видимо чего-то не понимаю…

Вот такой код не останавливает работу правила. Что здесь не так?

defineVirtualDevice('simple_enum', {
  title: { en: 'Simple ENUM', ru: 'Просто ENUM' },
  cells: {
    simpleENUM: {
      title: { en: 'ENUM', ru: 'Перечисление' },
      type: 'value',
      value: 1,
      enum: {
        0: { en: 'Zero', ru: 'Ноль' },
        1: { en: 'One', ru: 'Один' },
        2: { en: 'Two', ru: 'Два' },
        3: { en: 'Three', ru: 'Три' }
      },
      readonly: true
    }
  }
});

var enumRotateRule = defineRule(‘rotateEnum’, {
when: cron(‘@every 5s’),
then: function() {
var newValue = (dev[‘simple_enum/simpleENUM’] + 1) % 4;
log.info(‘Циферка\t\t’, newValue);
dev[‘simple_enum/simpleENUM’] = newValue;
}
});

defineRule(‘stopRorating’, {
when: function() {
return dev[‘simple_enum/simpleENUM’] == 0
},
then: function() {
log.info(‘Пробуем остановить ротацию’);
disableRule(enumRotateRule);
}
});

На всякий случай диагностика

приложен диагностический архив, доступен только сотрудникам поддержки
(442,7 КБ)

Добрый день.
Да, воспроизвел. Именно для правил работающих на cron - не срабатывает.
Оформил багрепорт, благодарю за внимательность. И, особенно, за точное и лаконичное описание. Читаю тему с удовольствием.

Подскажите пожалуйста судьбу багрепорта. На гитхабе я его не нашел.

Тоже столкнулся с тем, что управление правилами cron не работает.

Пока не в работе.

У нас внутренний багтрекер, не связанный с гитхабом.

Жаль. Получается, что единственная альтернатива - setInterval/clearInterval?

Достаточно переменной-флага, который проверять в функции, в общем.

Да, это еще проще, спасибо!

Проблема исправлена в тестинге, теперь enableRule/disableRule работает с cron правилами.

В последнем обновлении в cron-правилах конструкция “*/20 * * * *” приводит к срабатываниям в 20-ть минут каждого часа. Пришлось везде менять на “@every 20s”. Проверьте пожалуйста, где-то вкралась ошибка.

*/20 * * * * - срабатывает каждые 20 минут как и ожидается, если вам необходимо каждые 20 секунд, то @every 20s равносильно */20 * * * * *.

1 лайк

До последнего обновления это выражение срабатывало каждые 20 секунд. Именно это от него ожидалось, и именно так описано в документации в документации к wb-rules https://github.com/wirenboard/wb-rules:

Вместо @hourly здесь можно задать любое выражение, допустимое в стандартном crontab, например, 00 00 20 * * (секунды минуты часы, выполнять правило каждый день в 20:00).

Вы ожидаете другого поведения, потому что, по-видимому, больше осведомлены об изменениях в коде, чем известно таким простым пользователям, как я. Это внезапное изменение поведения могло привести к фатальным последствиям, если бы управляло отоплением. Благо отопительный сезон окончен, поэтому ничего не рвануло из-за перегрева.

Отнюдь.
В документации описано что если передаваемых значений 5 - то минуты. А в " Alternative Formats" - значений 6.
Насколько я понимаю формат не менялся. Посмотрел в старые правила - там ввсе без изменений.

Очень жаль, что вы предпочитаете объяснить мне, что я сам дурак, вместо того, чтобы разобраться в проблеме и либо внести изменения в документацию, либо внести изменения в код, либо коммуницировать клиентам исправленный баг.

Еще раз повторю свою сообщение: до последнего обновления wb-rules на протяжении минимум двух последних лет у системы было другое поведение, указанная конструкция вызывала cron-правило раз в 20 секунд. После обновления правило стало срабатывать раз в 20 минут. Это существенное изменение, о котором было бы неплохо предупредить ваших дорогих клиентов, чтобы предотвратить такие последствия, как взорванный бойлер, сгоревший теплый пол или даже сгоревший дом.

Практика - критерий.
На контроллере с релизом 2501 выполняю правило

defineRule("crontest_test", {
  when: cron("*/20 * * * * *"),
  then: function () {
    log.info("cron rule fired");
  }
});

Получаю:

Там же но 5 параметров

defineRule("crontest_test", {
  when: cron("*/1 * * * *"),
  then: function () {
    log.info("cron rule fired");
  }
});

То же на актуальном релизе:

Я на ветке testing, версия wb-rules 2.31.1, ваш скрипт с пятью параметрами выдает:

May 28 11:45:00 wirenboard wb-rules[27811]: INFO: [rule info] cron rule fired
May 28 11:46:00 wirenboard wb-rules[27811]: INFO: [rule info] cron rule fired
May 28 11:47:00 wirenboard wb-rules[27811]: INFO: [rule info] cron rule fired
May 28 11:48:00 wirenboard wb-rules[27811]: INFO: [rule info] cron rule fired

Вы исправили в документации формат на

<second> <minute> <hour> <day of month> <month> [<day of week>]

и пока получается, что это неверно: “<day of week>” является обязательным, а не опциональным параметром для версий wb-rules начиная с 2.31.1

Вы правы, поведение изменилось начиная с 2.31.0, сейчас в 2.31.2 поправили и вернули старое поведение. Документация не совсем соответствовала действительности, формат был не стандартным как в crontab, а <second> <minute> <hour> <day of month> <month> [<day of week>]. В 2.31.0 формат стал [<second>] <minute> <hour> <day of month> <month> <day of week>, что и вызвало проблему. Подчеркну, что все это касается только тестинга.

1 лайк

Проверил новую версию, подтверждаю исправление, спасибо.

1 лайк