Проблема с наличием скобок в MQTT-топике

Контроллер Wirenboard 7. Обнаружилась проблема при вызове из правил команды runShellCommand ('mqtt-delete-retained /devices/wb-msw-v4_37/controls/Air Quality (VOC))

Команда выполняется с ошибкой. Лог приводится ниже. Проблема в наличии скобки.

28-02-2024 18:37:56.565 ERROR: command ‘/bin/sh -c mqtt-delete-retained /devices/wb-msw-v4_37/controls/Air Quality (VOC)’ failed with exit status 2
28-02-2024 18:37:56.563 /bin/sh: 1: Syntax error: “(” unexpected

Есть ли возможность обойти эту неприятность в команде runShellCommand()?
Аналогичная проблема возникла при работе с Zabbix-агентом обоих версий.

Добрый день.
Например, так:
runShellCommand ('mqtt-delete-retained "/devices/wb-msw-v4_37/controls/Air Quality (VOC)"')

Доброе утро! Проверил. Из правил команда в таком виде заработала. Спасибо большое. По крайней мере теперь удается избавиться от всех зависших топиков без исключений.
С Zabbix-агентом проблема пока сохраняется. Агент при запуске отказывается принимать в качестве аргумента командной строки топик, в котором содержатся скобки. Пробовал как одинарные, так и двойные кавычки в настройках Item Zabbix-сервера.
Настройку осуществляли в соответствии с: Zabbix — Wiren Board
Соответственно, не проходит значение mqtt.value[/devices/wb-msw-v4_37/controls/Air Quality (VOC)] в поле Key настроек Item. Скриншот приведен ниже.


При этом штатный mqtt-плагин, который входит в состав Zabbix-агента 2, команду mqtt.get[,/devices/wb-msw-v4_37/controls/Air Quality (VOC)] прекрасно понимает и отрабатывает. Однако в нашем случае применение Zabbix-агента 2 по ряду причин не очень удобно. Не поможет ли Wirenboard как-то решить эту проблему?

Добрый день.
Как я понимаю - zabbix agent первый и используете неудобный способ с userParameter.
Ну что ж, тут ваш выбор.
В документации zabbix описано: 3 Zabbix agent (UNIX)
Я добавляю в /etc/zabbix/zabbix_agentd.conf.d/zabbix-mqtt.conf

UnsafeUserParameters=1

и получаю:

zabbix_agentd -t mqtt.value['/devices/wb-msw-v3_60/controls/Air Quality (VOC)']
mqtt.value[/devices/wb-msw-v3_60/controls/Air Quality (VOC)] [t|190]

Спасибо Вам большое! Теперь все пошло так, как и должно. Проверяли и в пассивном и в активном режиме получения данных. Вы пишете, что способ с userParameter неудобен. А какой способ могли бы порекомендовать Вы, воспользоваться Zabbix-агентом 2 и его штатным mqtt-плагином?

Да. Это более удобно, работает быстрее и потребляет вполовину меньше ресурсов. Особо заметно когда топиков сотни.

Да, мы пробовали такой подход. При установке поля Key в mqtt.get[], работающего со штатным плагином, пропадает поле Update interval. Получается, что метод mqtt.get[] получает данные от плагина агента и передает из на Zabbix-сервер по мере их изменения, а не в соответствии с установленным интервалом, как в случае с mqtt.value[]. Из MQTT monitoring and integration with Zabbix непонятно, можно ли управлять периодом. В конфигурационных файлах имеются только таймауты, а не интервалы. Ниже скриншот с графиком Air Quality, полученным с чередованием методов mqtt.value[] и mqtt.get[].

Видно, что объем данных при методе mqtt.get[] сильно возрос. Усреднение с помощью препроцессинга нам не подходит. Поэтому нам пока не очень понятно как за счет применения штатного плагина уменьшается нагрузка.

При использовании агентаv2 уменьшается нагрузка на систему WB, а не объем получаемых\обрабатываемых и хранимых данных в zabbix - он то возрастает.
И вы совершенно правы - второй агент подписывается на топики и реагирует на изменение данных в них - поэтому нет интервала опроса.
И со вторым агентом есть неприятный фокус - если сервер zabbix недоступен (по каким либо причинам) - то агент впадает в постоянный отвал \ реконект к mqtt брокеру mosquitto по таймауту.

1 лайк

Спасибо большое за исчерпывающие ответы. Будем колдовать дальше:)