WirenBoard 6.7 используется для мониторинга состояния дизель генератора, при смене уровня входа - отправляется сообщение.
Сейчас, постояно происходит следующее - после перехода уровнеь в 0, через 5-15 минут в mqtt снова приходит сообщение о нулевом уровне, отчего скрипт отправляет сообщение повторно.
Вот - лог состояний аналогового входа, видно что в 13:25 уровень был низкий и ничего не происходило
Пакета wb-mqtt-gpio в системе не установлено(прошивка с фабрики не менялась), в системе стоит wb-homa-gpio 1.19.5, я так понимаю он исполняет эти функции. Никаких записей в логах /var/log/messages.* содержащих слово gpio за несколько дней работы пока были эти срабатывания - нету, текущий аптайм системы - около 30 дней.
Не знаю, поменять вход на обьекте сейчас не могу. Есдинственное что приходит в голову - отредактировать скрипт чтобы запоминал предыдущее состояние, и отрабатывал значение только в том случае если оно не совпадает с предыдыщим.
так ведь и whenChanged не должен срабатывать, если приходит ноль ещё раз. Вообще гарантий на то, что соощение в mqtt придёт один раз при изменении состояния нет. Есть гарантия, что посленее сообщение соответствует текущему состоянию.
Это не про QoS, это на логическом уровне. Например, драйвер при старте отправляет текущие значения в MQTT. Или вот wb-mqtt-serial с соответствующей настройкой может публиковать даже неизменные значения раз в N секунд. Т.е. для получателя нет гарантий, что сообщение приходит только об изменениях. Но я не могу представить случаи, где это этого могут быть проблемы.
Сходу не помню. Пожалуйста расскажите, для чего это вам нужно, чтобы мы пошли смотреть.
Для критичных правил, где нужна надёжность, используем свой софт вместо встроенного, и хотелось бы там иметь те же гарантии, что и при использовании софта wb. Отсюда вопрос.
Я сам пытался найти ответ в ваших исходниках.
В wb-rules, насколько я понял, при подписке используется QoS = 2. А вот какой QoS используется в драйверах, в частности, gpio - не смог найти, даже просто в коде ничего не находится по слову “publish”, у вас этот код в приватном репо?
Повторные срабатывания все еще продолжаются и у меня нет идей как их корректно отбраковывать
Например, если сохрянять временное значение в локально переменной это помогает до первого перезапуска движка или редактирования скрипта, что тоже немного бесит так как ложные срабатывания как минимум один раз после этого происходят.
var prevValue;
defineRule("diesel_control", {
whenChanged: "wb-gpio/A1_IN",
then: function (newValue, devName, cellName) {
if (newValue != prevValue)
{
if ( newValue == 1) {
runShellCommand('/root/dieselOn.sh')
}
else if ( newValue == 0) {
runShellCommand('/root/dieselOff.sh')
}
}
prevValue = newValue;
}
});
Ну мне например нужно получить срабатывание скрипта по фронту, то есть по перепаду его с 0 на 1 или с 1 на 0.
А так получается что whenChanged не гарантирует получения изменения значений, а тольно то что в mqtt придет какое то значение, может быть и идентичное предыдущему.