Пробелы в названиях топиков mosquitto

Может кто-нибудь объяснить, с какой целью в шаблонах устройств WirenBoard в названиях топиков, в конечных переменных, используются пробелы?

Зачем было называть /devices/wb-m1w2_0x004e/controls/External Sensor 1?
При этом почему-то правильно назван /devices/wb-gpio/controls/EXT1_R3A1. Почему бы его тоже было не назвать /devices/wb-gpio/controls/EXTERNAL 1 RELE 3A 1, “до кучи”?

Я понимаю, что правила http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718109 позволяют использовать пробелы в названиях. То есть спецификации соблюдены, нарушений нет. Но!

Мало того, что постоянно возникают разные проблемы в передаче подобных параметров.
Для меня самое главное, - при фильтрации топиков в mosquitto.conf невозможно использовать топики с пробелами, потому что пробел воспринимается системой разделителем.
Я не нашел никакого способа передать парсеру правильное название с пробелом, - ни разнообразные кавычки, - ничего не работает.

В реальности мы используем (передаем, записываем в БД) только несколько значений со счетчиков WB. Но сами счетчики генерируют такое количество параметров, что нужные значения теряются в этом море, не говоря об износе флеш-памяти. Фильтрация топиков решает эту проблему, - но она невозможна из-за пробелов!

Может быть кто-то знает, как фильтровать эти… ммм “непрограммистские названия переменных”?
Единственное найденное рабочее решение - редактировать шаблоны из поставки, заменяя пробелы символом “_”. Но это не самое хорошее решение, т.к. при обновлении они будут перезаписаны.

Может я чего-то не вижу, не понимаю? Какой-нибудь %20 может помочь?

3 лайка

77dragon, добрый день!
Могу посоветовать вам сделать копию шаблона с другим типом устройства: только с нужными параметрами и только с подходящими вам названиями топиков. Тогда при апгрейде софта ваш шаблон не затрется обновленными, а вы будете получать только нужные данные в необходимом вам формате.

Что удалось тоже в свое время найти:

Но можно же было сразу сделать External_Sensor_1, ИМХО, ничего бы не изменилось… Программисты ведь работали. Ну почему, - в именах переменных (!), - пробелы?!..

А потом пишешь в поддержку, а тебе говорят: “тут какой-то шаблон не наш… замените на стандартный, ваш никто проверять не будет”. Или шаблон сам разработчик изменил, - опять все менять…

Эх… (((

2 лайка

Добрый день!
Я отчасти разделяю ваши чувства.
Но, переходя к сути, вижу за ними только одну реальную проблему (настройки бриджа в mosquitto не работают с топиками с пробелами, потому что так захотели разработчики mosquitto) с простым обходным решением (создать свои копии шаблонов без пробелов).
Сталкивались ли вы ещё с какими-то проблемами из-за пробелов?

а у меня была проблема с VOC топиком , из-за круглых скобок не работает в OpenHab

Решается проблема у меня таким способом:

Присоединяюсь ко всем негодующим, может хотя бы в следующих девайсах не будете использовать спецсимволы в топиках.

1 лайк

Уже пробовал - не помогло

Даже с небольшим количеством модулей через бридж по умолчанию “летит” большое количество данных.
Траффика за месяц набегает более 1,5 Gb
Лишние деньги за превышение приходится отдавать и забивается БД на сервере.

Отладить приложение не просто, когда валит чухом состояние всего, что, как я понимаю, и предлагается делать, если забить на пробелы и, тем самым, бриджем не заниматься.
Ну и очень интересно все-таки узнать причины такого положения дел. Что побудило разработчиков таким образом поименовать топики.
Или так, раз уж mosquitto такой кастомный и ну никак не работает с пробелами, может есть предложение, какой еще брокер можно использовать, который так же пользуется спросом, но не имеет этих ограничений? Ну чтоб он был распространен и т.д.
Мне показалось, что вы, разработчики, упоминаете mosquitto, вероятно, пользуетесь. А такой ляп не торопитесь исправлять… Возможно, причины в другом? Может глючить начинает контроллер, если много записей будет в бридже, может еще какие косяки, и потому вы и не наводите в этом вопросе порядок.

А мне это очень странно. Программисты использовали архитектурно в названия переменных пробелы (спецсимволы)?!. Интернет, как бы, однозначно говорит, - да, спецификация позволяет, но не делайте этого, пожалуйста, никогда! Иначе замучаетесь потом глюки ловить.

Я логику не понимаю. Одно с пробелом, другое - с подчеркиванием.

Главное, ведь, - конечный пользователь никогда не увидит этих названий. Ему все равно, что там написано в топиках, он увидит “Свет в гостиной”. Только инсталлятор их видит, а ему эти пробелы (скобки, …) - “очень мешают”. И даже инсталлятор в большинстве случаев не пишет эти жуткие названия, он их копипастит из интерфейса.

Ну то есть ни одного плюса в названии “External Sensor 1” лично я не вижу, - одни минусы. А ответ разработчика - “это не работает, потому что так захотели разработчики mosquitto”.

Причем здесь разработчики mosquitto? Они пробелы и скобки в названиях переменных в шаблонах wirenboard использовали? Их косяк (такое поведение бриджа “супротив спецификации”) - это их косяк. Так косяков разных много, поэтому разумный интернет и пишет в white paper, чтобы не нарываться на чужие грабли, и обходить даже будущие возможные ошибки, - “никогда не используйте пробелы и спецсимволы в названиях переменных”.

3 лайка

и вот этот разброд в логике очень напрягает) Сразу понимаешь, что где-то еще будут недоделки и косяки( И такое знакомое чувство ожидания подвоха на каждом шагу)

Также столкнулись с проблемой наличия пробелов в названиях mqtt топиков при настройке бриджа. Сейчас планируем править шаблоны всех устройств с которых надо пересылать некоторые метрики через бридж в облако. В связи с этим вопросы:

  1. Как правильнее делать - создавать новые пользовательские шаблоны в /etc/wb-mqtt-serial.conf.d/templates или править стандартные шаблоны в /usr/share/wb-mqtt-serial/templates ?
  2. Шаблоны довольно большие. Для того, чтобы убрать пробелы в названиях mqtt топиков, какие секции в шаблоне надо править (groups, parameters, channels, translations)?

Так, а напомните, что за проблема с ними? Топики в бридж отлично передаются:


Только что проверил.

Попробуйте передать конкретно топик, в имени которого есть пробел, и поймете. Например, такой настройкой:

topic /Ch 1 Total P out 2 /devices/wb-map12e_180/controls /AIG2NB6T/wb-map12e_180

Нам нужно передавать для обработки в облако конкретные топики от конкретных устройств, если передавать все (например, так topic /# out 2 /devices/wb-map12e_180/controls /AIG2NB6T/wb-map12e_180) это бессмысленно расходует ресурсы.

Ага, понятно, попробовал. Ищью так и висят уже годами.

Я бы сделал просто перепубликацию нужных топиков в некий подтопик типа /export
Это точно проще.
Но вообще - лучше конечно в пользовательские.

channels

Я бы сделал просто перепубликацию нужных топиков в некий подтопик типа /export
Это точно проще.

А можно этот вариант поподробнее?

Функцию, которая создает правила. На вход функции подавать топики - и в общем все. Правило перепубликовывает (только топик!).

//02_23_test_01.js
function mqtt_republic(sTopic, dPath){
  defineRule("republic_"+sTopic, {
    whenChanged: sTopic, 
  	  then: function (newValue, devName, cellName) {
        publish(dPath+devName+"/"+cellName, newValue, 2, false);
        //log.info(dPath+devName+"/"+cellName)
      }
  });
}

mqtt_republic("hwmon/CPU Temperature", "/testpath/");
mqtt_republic("wb-adc/Vin", "/testpath/");

Насколько я понял, в чистом виде этот скрипт не решает проблему пробелов в имени топика. Его надо модифицировать, чтобы он менял наименование топиков.

Сейчас пошли по варианту, который подсмотрели в Настройка процесса отправки сообщений по MQTT-мосту - #6 от пользователя Demix Т.е. помимо изменения имени топика еще управляем частотой отправки сообщений в облако. Единственное, очень громоздкие скрипты получаются.