Отработка правил завязанных на счетчики при перезагрузке

Максим день добрый.
Протестировал, не помогло, при перезагрузке драйвера а дебаг логе появляются строчки типа:

2024-04-10 14:37:49срабатывание правила newValue: 0, output: wb-mr6cu_54/K3, this.prevValue: undefined
2024-04-10 14:37:49срабатывание правила newValue: 1, output: wb-mr6cu_58/K4, this.prevValue: 1
2024-04-10 14:37:49срабатывание правила newValue: 0, output: wb-mr6cu_58/K5, this.prevValue: undefined
2024-04-10 14:37:49срабатывание правила newValue: 2, output: wb-mr6cu_54/K2, this.prevValue: 2
2024-04-10 14:37:49срабатывание правила newValue: 2, output: wb-mr6cu_54/K3, this.prevValue: 2

Свет включается все равно…
При перегрузке контроллера ситуация аналогичная.

На всякий случай прикладываю диагностический архив:

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

Хорошо, спасибо.
Еще подумаю как обойти эти проблемы.
Багрепорт отправил программистам, принимают решение об исправлении на более глобальном уровне. По срокам пока не сориентировали.
Сообщения из лога не говорят о том что срабатывание реле произошло, все эти случаи обрабатываются дальнейшими условиями и должны отсекаться.

newValue: 0, output: wb-mr6cu_54/K3, this.prevValue: undefined
Исключается этим условием: if (newValue == 0 && !this.prevValue) return;
newValue: 1, output: wb-mr6cu_58/K4, this.prevValue: 1
newValue: 2, output: wb-mr6cu_54/K2, this.prevValue: 2
Исключается этим условием: if (newValue === null || newValue == this.prevValue) return;

Спасибо, очень жду обратную связь

Чтобы заранее считать и сохранить стартовое значение счетчика и сравнивать с новым значением.

Совсем не часто. Только это наоборот делает эти случаи менее прогнозируемыми и потенциально более опасными.
Предположу такой пример, высосанный из пальца:
Интегратор, по просьбе заказчика, доработал какое-то правило, после этого внес изменения в сериал когфиг. Что привело к срабатыванию правил со счетчиками. Возможно это будут ворота, возможно что-то другое.
Понимаю, что вероятность такого мала, но она есть, и если это можно обработать на более низком уровне, будет супер.
Мне не дает покоя логическая нестыковка, что при перезагрузке драйвера значение счетчика вроде как не меняется, но приходит whenchanged на его изменение. Предполагаю, что топик удаляется, потом заново пишется. Позволю предположить, что можно попробовать решить это замещением новым значением, вместо удаления, а удалять, только если нового значения нет.

Добрый день.
Давайте начнем немного сначала.
Пожалуйста, обновите контроллер до последней версии: apt update; apt upgrade -y
И попробуйте воспроизвести тесты по новой.
Для более детального изучения процесса выполнения скрипта, давайте добавим больше вывода в лог:

Спойлер
function button(name, input, output) {
  defineRule({
    whenChanged: input + " Single Press Counter",
    then: function (newValue, devName, cellName) {
      log("срабатывание правила newValue: {}, output: {}, this.prevValue: {}".format(newValue, output, this.prevValue));

      log("1 if (newValue === null || newValue == this.prevValue) return;")
      if (newValue === null || newValue == this.prevValue) return;
      log("ok")
      log("2 if (newValue == 0 && this.prevValue < (65536 - 5)) return;")
      if (newValue == 0 && this.prevValue < (65536 - 5)) return;
      log("ok")
      log("3 if (newValue == 0 && !this.prevValue) return;")
      if (newValue == 0 && !this.prevValue) return;
      log("ok")
      if (!this.prevValue) log("!this.prevValue - значения не существует");

      dev[output] = !dev[output];
      log("РЕЛЕ ПЕРЕКЛЮЧИЛОСЬ!")
      this.prevValue = newValue;
    }
  });
}

С этим кодом мы провели ряд тестов, всё работает как я описал в изначальном решении. Ложных срабатываний не происходит.
Если проблема останется, то позвольте подключиться к вашему контроллеру через WB Cloud и провести диагностику на вашем оборудовании.

Проверил, все равно срабатывает, готов предоставить доступ, какому пользователю предоставить доступ? Или мой логин пароль скинуть?

Нет, ничего не нужно.
Я перекину ваш контроллер из вашей организации в нашу и проведу диагностику.
Постараюсь светом сильно не моргать.

Ок, не проблема

Вернул всё на место.
Пока что ждем решения от программистов.
Скриптами всё не получается предусмотреть.
Приоритет задачи был повышен. Планируется решение в течение недели.
Я оповещу, сразу как будет результат.

3 лайка

Спасибо большое) радует что меня все таки поняли и услышали)

Подскажите, я могу правила вернуть к первоначальному виду которые вы отключили? Я как понимаю в выходные все равно никто не будет заниматься данным вопросом, а без диодных лент тяжеловато )

Да, конечно. Я видимо забыл раскомментировать то что убирал.

Вечер добрый, дабы тема не закрылась автоматом да для своего любопытства спрошу - по данному вопросу нет результатов? Когда можно ждать хотя бы примерную вилку времени…

Добрый день.

Тема не закроется, пока вопрос не решится.

По срокам пока нет точной информации, но задача уже в работе.
Как будут новости, сразу же свяжемся с вами, не переживайте.

Добрый день, я решил все же напомнить о проблеме… мучения продолжаются наши…(

Добрый день.
К сожалению, изменения на глобальном уровне могут затронуть пользователей, которые ориентируются на текущее поведение движка правил wb-rules.
По этому, всё-таки придется обходиться костылями.
Скрипт ниже учитывает перезапуск контроллера и перезапуск wb-mqtt-serial, но после сохранения скрипта, первое нажатие на клавиши не будет переключать состояние выхода, все последующие будут отрабатывать корректно.
Это пока что не финальная версия костыля, по возможности пытаюсь придумать универсальное решение. Но такой вариант хотя бы не будет доставлять неудобств при отключении электроэнергии.

function button(name, input, output) {
  defineRule({
    whenChanged: input + " Single Press Counter",
    then: function (newValue, devName, cellName) {
      if (this.prevValue === undefined) {
        this.prevValue = newValue;
        return;
      }
      if (this.prevValue == newValue) {
        return;
      }
      log("newValue", newValue);
      dev[output] = !dev[output];
      this.prevValue = newValue;
  }
})}

Спвсибо, накачу правило, позже дам обратную связь

Существующие инсталляции не должны пострадать, но и текущие пользователи не должны же тоже мучаться костылями, верно?

Может вынести опцию в какой-нибудь конфиг и в вики описать как текущее поведение так и возможность это переключить?

Или как вариант вынести в then 4 аргумент = флаг фактического изменения, чтобы внутри правила мы могли отбросить «все служебное»?

1 лайк

Нашли способ исправить такое поведение.
Баг в процессе устранения.
Я оповещу в этой тебе когда будет готово решение.

1 лайк

Добрый день.
Давайте попробуем начать с обновления ПО контроллера до последнего релиза.
apt update && apt upgrade -y

И всё-таки заменим на изначальный скрипт, который предлагался в самом начале:

/* 1. Одиночное нажатие на включение*/
function button(name, input, output) {
    defineRule({
        whenChanged: input + " Single Press Counter",
        then: function(newValue, devName, cellName) {
            log("Срабатывание правила newValue: {}, output: {}, this.prevValue: {}".format(newValue, output, this.prevValue));
            if (newValue === null) return;
            if (newValue == this.prevValue) return;
            if (newValue == 0) {
                if (this.prevValue < (65536 - 5)) {
                    return;
                }
            }
            if (newValue > 0) {
                log("Выход переключился")
                dev[output] = !dev[output];
            }
            this.prevValue = newValue;
        }
    })
};

У меня воспроизводится всё ожидаемо.
Дайте, пожалуйста, обратную связь.