Глюк с mqtt на wb5

Занялся тут переделками… Поскольку интерфейс WB не особенно удобен для использования, в свое время принял решения скрестить WB5 с Мажордомо. Оно работало, но работало своеобразно, впечатление от Мажордомо скорее отрицательные в итоге. Ощущение замусоренной помойки, постоянные подтормаживания (могло отработать команду сразу, а могло и секунд 5 висеть), сильно грузит процессор, оптимизации никакой. Время от времени (не часто) возникази проблемы с WEB интерфейсом, помогала только перезагрузка. Ну и регулярно случалось что с новым обновлением возникали проблемы, потом, правда, исправляли… В итоге решил перейти на ioBroker. Очень порадовал. Удобен, быстр, очень напоминает идеологией SCADA. Удобный дизайнер интерфейса. Нагрузка на процессор низкая, на Orange Pi Zero летает и утилизирует его процессор не выше 20%. Вообщем, все проблемы от Мажордомо решились сами собой. И теперь подошел к вопросу глюка…

Сей глюк был и на Мажордомо, остался он и на ioBroker, просто раньше и других проблем хватало, старался не замечать, благо не сильно критично. Суть в следующем. Для простоты… есть реле, оно может управляться разными путями - кнопкой, подключенной к WB, интерфейсом WB, сторонним MQTT клиентом (в данном случае ioBroker). Все хорошо, все управляется, но при смене управления возникает однократная ошибка - не проходит команда через MQTT. Поясню. Включаю реле через кнопку или через интерфейс WB5 - срабатывает. Выключаю реле через ioBroker - не срабатывает. Еще раз в ioBroker нажимаю “включить-выключить” - отрабатывает. То есть это происходит только после того, как устройство меняет точку управления. Если посмотреть состояние MQTT в этот момент на WB5 - то ему в топик (разумеется, с /on) не приходит изменения (или он не хочет его воспринимать с первого раза), на iBroker - вижу изменение состояния соответствующего топика, но с меткой “false”

То есть клиент честно пытается отправить на WB5 топик, но не получает подтверждения от WB. При следующей попытке и в последующем - все нормально отправляет до тех пор, пока не изменится управление на кнопку или WB.

Это как-то можно вылечить? Оно конечно, можно и 2 раза нажать, но как-то некрасиво…

Я не очень понял из описания в чём проблема. Помогли бы логи из запущенного mosquitto_sub с комментариями.

что-то типа

mosquitto_sub -v -t '/devices/wb-gpio/controls/A1_OUT/#'

для вашего канала, чтобы было видно и сообщения в /on и ответы от драйвера устройства.

Нет там ничего, на момент отправки команды с MQTT клиента брокер на WB5 просто не принимает ничего первый раз. Я это и описал, может несколько сумбрно… так и глюк возникает только при определенном стечении обстоятельств.

Попробую еще раз простыми словами. Щелкаю кнопкой в интерфейсе ioBroker - все работает стабильно. Иду к кнопочному выключателю на стене - нажимаю - отрабатывает изменение. Возвращаюсь к ioBroker - нажимаю тут - не отрабатывает, нажимаю еще раз - отрабатывает и дальше работает пока я не нажму снова кнопку на стене. Ну а дальше - все повторяется.

Всё гораздо проще: это ваш сторонний MQTT-клиент не отправляет сообщение в брокер на WB5. Брокер - это бесконечно тупая штука, она ничего не знает про состояния, прошлые сообщения и т.д. Если сообщение бы было отправлено, то вы бы его увидели в mosquitto_sub.
Разбирайтесь с ioBroker, виноват он.

Не похоже. С Мажордомо все точно также было. В первом сообщении я привел картинку с ioBroker - Он пытается отправить, но не получает подтверждения. Зато второй раз отправляет и дальше все отправляет нормально. Пока я снова не щелкну выключателем. Замечу, что при этом никаких изменений на ioBroker не происходит, я ничего с ним не делаю, происходит изменения на WB (от выключателя), после чего ioBroker снова становится в ступор при первой команде. Так что именно независимые изменения на WB (от выключателя) создают эту проблемку. Почему так отрабатывает MQTT непонятно, надеюсь, Вам как разработчику, это будет проще понять.

Ну ваше право мне как разработчику не верить, но наш брокер MQTT тут категорически не при чём. Если умеете, то можете запустить какой-нибудь Wireshark на компьютере и посмотреть сетевой трафик от ioBroker.

Более того, я не знаю, что такое “не получает подтверждения”. Нету в MQTT никаких подтверждений, это какая-то логика уже во внешнем ПО. Могу предположить, что и Majordomo и ioBroker написаны криво и не могут нормально обработать ситуацию, когда контрол поменялся без их участия, поэтому и сходят с ума.

Не в курсе.

Я использую два контрола - с /on и без него. Второй чисто read-only для индикации состояния. Второй всегда меняет состояние при изменении без его участия, впрочем, с /on тоже отрабатывает индикацию до тех пор, пока на /on я не начинаю что-то посылать. Может и такое, конечно, быть, ioBroker видит стороннее изменение контрола, что-то клинит и первая попытка уже собственного изменения ни к чему не приводит. Потом он уже понимает, что контрол на нем самом поменялся им самим (со второй попытки) и работает нормально. Вообщем, странно это, конечно… ладно, буду искать… спасибо!

Вообщем разобрался. Причина была действительно в том, что ioBroker не отсылал изменения, WB ни при чем. Евгений, Вы были совершенно правы. А дело оказалось не в ошибках ioBroker, а в банальной галке в настройках “отсылать только изменения” в его mqtt клиенте. Он просто не понимал, что произошло изменение, сделанное кем-то сторонним и соответственно ничего не отправлял, как ему и было указано. Вопрос полностью снят.

1 лайк

перестал работать mosquitto_pub
волшебство какое то. Открываю два терминала. в одном ставлю мониторинг топика в дргугом меняю топик на вкл. Результат более чем странный:


Кстати, по факту действие не происходит. То есть значение не меняется. Где собака порылась ?

флажок -r

1 лайк

с обновлением опция появилась ?

всегда была

странно до обновления именно так изменял значения в топике.
в wiki надо поправить значит.
http://contactless.ru/wiki/index.php/MQTT

В вики всё правильно написано. Я не заметил сначала, вы просто не то делаете: вам же не сообщение в топик отправить надо, а команду на исполнение. Для этого нужно к топику добавить “/on”. Подробнее в примерах и в вашей же ссылке. Флажок -r ставить не нужно.

1 лайк

тогда вопрос снимаю. Спасибо за подсказку ! ( кстати с флажком -r значение изменяется =) )