Хорошо, спасибо.
Еще подумаю как обойти эти проблемы.
Багрепорт отправил программистам, принимают решение об исправлении на более глобальном уровне. По срокам пока не сориентировали.
Сообщения из лога не говорят о том что срабатывание реле произошло, все эти случаи обрабатываются дальнейшими условиями и должны отсекаться.
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 и провести диагностику на вашем оборудовании.
Вернул всё на место.
Пока что ждем решения от программистов.
Скриптами всё не получается предусмотреть.
Приоритет задачи был повышен. Планируется решение в течение недели.
Я оповещу, сразу как будет результат.
Подскажите, я могу правила вернуть к первоначальному виду которые вы отключили? Я как понимаю в выходные все равно никто не будет заниматься данным вопросом, а без диодных лент тяжеловато )
Вечер добрый, дабы тема не закрылась автоматом да для своего любопытства спрошу - по данному вопросу нет результатов? Когда можно ждать хотя бы примерную вилку времени…
Добрый день.
К сожалению, изменения на глобальном уровне могут затронуть пользователей, которые ориентируются на текущее поведение движка правил 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;
}
})}