Публикация топика в MQTT из Home Assistant

Здравствуйте, контроллер WB 7, релиз 7.4.3.
На отдельном Raspberry Pi4 установлен Home Assistant, на котором используется аддон для работы с радиоустройствами (RTL_433). Данный аддон получает информацию с устройства и должен опубликовать в MQTT топик в формате: devices=rtl_433/9b13b3f4-rtl433/devices[/type][/model][/subtype][/channel][/id],events=rtl_433/9b13b3f4-rtl433/events,states=rtl_433/9b13b3f4-rtl433/states

Нужно ли в конфигурации MQTT на WB где-то отдельно разрешать для сторонних устройств возможность публикации топика?
На текущий момент данные с радиопередатчика в HA получаются, но при попытке отправить данные на MQTT - происходит ошибка.
В качестве параметров, куда отправлять данные - просто указываю MQTT на WB:
output mqtt://192.168.8.10:1883,user=user,pass=pass,retain=true

Добрый день.

Нет. По умолчанию включен даже анонимный доступ, его по хорошему надо отключать.

А какая ошибка? Ну и - пробую воспроизвести.
Выполняю с компьютера

mosquitto_pub -h 10.0.0.76  -t "/client/temp1/temp" -m "11"

Подписавшись на контроллере на топик получаю ожидаемое:

mosquitto_sub -v -t /client/temp1/temp
/client/temp1/temp 11

Добрый день, спасибо, через подписку на топик увидел его в MQTT. Я изначально пытался найти его на странице в web интерфейсе, там его нет.

У меня теперь следующий вопрос: как можно данные из этого топика вытащить в виртуальное устройство на WB?
Я пробовал правило:

defineRule({
  whenChanged: "/devices/TS-FT002/controls/depth_cm",
  then: function (newValue, devName, cellName) {
	dev["WaterLevel/Level"] = "/devices/TS-FT002/controls/depth_cm";
  }
});

но не получается.

Сейчас в MQTT есть и JSON строка со всеми данными или данные по отдельности:


Можете подсказать как это отправить в виртуальное устройство на WB?

Можно сразу публиковать в соответствии с конвенцией.

Нет, неверно.
Как написано в документации dev работает только с конвенционными.
Нужно использовать trackMqtt для работы с произвольными.
Например Подключение сторонних устройств Shelly по MQTT со своим топиком shellies - #6 от пользователя DEMON

Добрый день, спасибо за помощь, по указанному варианту все получилось. Теперь у меня получаются данные с датчика уровня воды, который работает на 433МГц!
image
И все это красиво прокидывается в HA!
на служебной панеле:

и на планшете для пользователей:


Спасибо за качественную поддержку!

Я рад что все получилось. Не составит ли вам труда описать получившееся? Выложить модель приемника на 433, получившийся в итоге скрипт?
У нас был трансивер 433, ныне снятый с производства - но периодически у кого-нибудь возникает потребность использовать такие устройства.

Да, конечно, в выходные все подробно опишу и напишу! Как раз уже и графики расхода и накопления появились за несколько дней.

Отлично, это здорово поможет тем кто будет использовать аналогичное.

Добрый день, описываю конечный результат:
Задача:
На участке имеется колодец, с насосом, который является источником водоснабжения дома. Плюсом стоит система автоматического полива газона. Поскольку с ведрами в него никто не заглядывает, то колодец закрыт плоской, тяжелой крышкой. Возникает вопрос о контроле остатка воды в колодце, и как следствие принятия решения о включении/выключении автополива и т.д.
Данное решение применимо не только для колодцев и для любых других емкостей с жидкостью.

Исходный данные по оборудованию:

  1. Контроллер WB7
  2. Одноплатник Raspberry 4Pi, на нем крутиться Home Assistant (в виде OS)
  3. Монитор уровня воды Ts-ft002
  4. Радиомодуль RTL-SDR V3 R820T2 RTL2832U (на алике он стоит в 2.5 раза дешевле).
  5. Антена на 433 MHz

Решение:
Прошлым летом, я приобрел монитор уровня воды Ts-ft002. Он состоит из датчика и самого монитора, который показывает в процентном соотношении остаток воды в колодце.
image
Частично задача была решена. Разместив монитор в доме, можно отслеживать уровень воды. Но никакой статистики о скорости наполнения и уж об удаленном мониторинге речь не идет. Немного изучив монитор, обнаружил, что от датчика к монитору данные передаются по радиоканалу 433 MHz. На этой частоте работает очень много бытовых устройств с радиоканалом (особенно много метеостанций с выносными датчиками).
Соответственно, если поймать этот радиосигнал отдатчика на монитор и конвертировать в данные, то далее их можно завести на любое устройство контроля.
Я приобрел радиомодуль RTL-SDR и антену к нему (на форумах пишут, что без антенны не будет ничего ловить даже совсем вблизи). Данный модуль принимает сигналы в широком диапазоне частот (не только 433 MHz).
Далее была попытка установить его напрямую в контроллер WB7 в USB порт, но она не увенчалась успехом, потому как я не разобрался как заставить контроллер видеть это новое устройство и взаимодействовать с ним.
Поэтому, я переставил радиомодуль RTL-SDR в одноплатник Raspberry 4Pi, на котором стоит Home Assistant (в виде OS) и который и является в конечном счете у меня центром всего “Умного дома”. После установки дополнения RTL_433, HA увидел приемник и стал получать данные.
Тут есть особенность, данное дополнение в текущей редакции, автоматически подтягивает данные внутри HA о MQTT брокере. Любые попытки указать внешний MQTT брокер (например, который стоит на WB) вызывают сбой в работе дополнения. Поэтому, я запустил на HA второй MQTT брокер и указал его для публикации данных. Структура формата MQTT топика формируется в строке в конфигурационном файле. У меня это выглядит так:
output mqtt://${host}:${port},user=${username},pass=${password},retain=${retain},devices=rtl_433/9b13b3f4/devices[/model]/controls,events=rtl_433/9b13b3f4/devices[/model]/controls/json/events,states=rtl_433/9b13b3f4/devices[/model]/controls/states
В итоге, через MQTT Explorer получаем следующую картину:


где топик TS-FT002 и есть наш датчик уровня. Бонусом можно брать данные с соседской метеостанции (Acurite-986).
Поскольку HA может работать только с одним MQTT брокером, то далее организуем мост и отправим данные с этого MQTT в Mosquito на WB. Делается это путем настройки файла на WB /mnt/data/etc/mosquitto/conf.d/20bridges.conf, в который добавляем следующие строки:

connection Homeassistant
address 192.168.8.4:1883 //адрес MQTT брокера на HA
remote_username логин пользователя MQTT
remote_password пароль пользователя MQTT
clientid WirenBoard
try_private false
start_type automatic
topic /# in 0 "" rtl_433/9b13b3f4 //HA - только забираем данные из HA и отправляем их на WB

Таким образом, теперь если посмотреть через MQTT Explore на WB, то видим, что у него появились данные от нашего датчика.


Тут есть нюанс, данные полученные от датчика имеют собственную структуру MQTT топика и необходимо их привести в стандартному виду. Для этого на WB мы создаем виртуальное устройство, в котором при помощи функции trackMqtt мы достаем данные и записываем их в топики виртуального устройства:

Спойлер

Код виртуально устройства

// Создаем новое виртуальное устройство WaterSensor

			var deviceName = "WaterSensor"

			defineVirtualDevice(deviceName, {
			  title: "Датчик уровня воды в колодце",
			  cells: {        
                  "UpdateTime":{
                            type: "text",
                            value: "",
                            readonly: true,
                            title: "Время последнего обновления",
                            },
                  "Model":{
                            type: "text",
                            value: "",
                            readonly: true,
                            title: "Модель датчика",
                            },
                  "Level": {
							type: "value",
							value: 0,
                            units: "m",
							readonly: true,
                            title: "Уровень воды в колодце"
                        	},
                  "TemperatureSensor": {
                            type: "temperature",
                            value: true,
                            units: "deg C",
                            title: "Температура на датчике"
                            }	  		     
              }
        	});


			defineRule("Level_change", {
			  whenChanged: deviceName+"/Level",
			  then: function (newValue, devName, cellName) {
			  }
			});

			defineRule("TemperatureSensor_change", {
			  whenChanged: deviceName+"/TemperatureSensor",
			  then: function (newValue, devName, cellName) {
			  }
			});

//Публикуем данные в MQTT виртуального устройства
//данные берем с JSON строки

			trackMqtt("/devices/TS-FT002/controls/json/events", function(message){ 
				var obj = JSON.parse(message.value);
				dev[deviceName+"/Model"] = obj.model; //Модель датчика
                dev[deviceName+"/UpdateTime"] = (obj.time); //Время последней передачи данных
                dev[deviceName+"/Level"] = parseFloat(obj.depth_cm)/100; //Расстояние от датчика до зеркаола воды.сразу переводим в метры. Датчик выдает в см
                dev[deviceName+"/TemperatureSensor"] = parseFloat(obj.temperature_C); //Температу ра в колодце (не очень поятно где именно он меряет, данные не сильно нужны)
			});

После этого, у нас в WB появляется устройство с интересующими нас данными и MQTT топик в стандартном виде:
image

Далее при помощи WB Engine Configuration отправляем это устройство обратно в HA, но уже в приличном виде:


и получаем в HA полноценное устройство:

В принципе задача выполнена, данные с датчика уровня воды перехватываются и отправляются на контроллер, где к ним есть постоянный доступ и можно писать историю наполнения, расходования и т.д.
Я далее в HA сделал вспомогательное устройство, которое на основании информации с датчика рассчитывает объем оставшейся воды и устройство, которое суммирует расход воды:


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


зная диаметр кольца колодца - можно вычислить объем оставшейся воды в литрах.

image
ну и зная максимальную заполняемость колодца, можно вывести графику, которая будет одновременно содержать информацию об остатке в литрах и показывать уровень заполненности колодца (синяя полоска).

Так же теперь доступен контроль расхода воды и графики восполнения:
image

Благодарю, просто отличное описание!
Похожее описывалось Рыбачим в эфире: данные с метеостанции, номер борта, соседский звонок и другие интересные находки / Хабр но без HA.

Да, эту статью изучал перед тем как слепить все. Но там не было расписано, как приемник подключили к WB (на этом я и сломался). Если есть где-то описание, то я бы наверное к WB напрямую подключился, что бы не городить лишних мостов и т.д.

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

Смущает то, что данные получаем на HA, потом через мост гоним их на WB, а потом обратно в HA. Было бы наверное более правильно, сделать как в той статье - подключение свистка к WB, на нем получать и обрабатывать данные. А потом уже, при необходимости гнать их на HA.
Но с другой стороны, работает - и ладно!

1 Like