Добрый день, описываю конечный результат:
Задача:
На участке имеется колодец, с насосом, который является источником водоснабжения дома. Плюсом стоит система автоматического полива газона. Поскольку с ведрами в него никто не заглядывает, то колодец закрыт плоской, тяжелой крышкой. Возникает вопрос о контроле остатка воды в колодце, и как следствие принятия решения о включении/выключении автополива и т.д.
Данное решение применимо не только для колодцев и для любых других емкостей с жидкостью.
Исходный данные по оборудованию:
- Контроллер WB7
- Одноплатник Raspberry 4Pi, на нем крутиться Home Assistant (в виде OS)
- Монитор уровня воды Ts-ft002
- Радиомодуль RTL-SDR V3 R820T2 RTL2832U (на алике он стоит в 2.5 раза дешевле).
- Антена на 433 MHz
Решение:
Прошлым летом, я приобрел монитор уровня воды Ts-ft002. Он состоит из датчика и самого монитора, который показывает в процентном соотношении остаток воды в колодце.
Частично задача была решена. Разместив монитор в доме, можно отслеживать уровень воды. Но никакой статистики о скорости наполнения и уж об удаленном мониторинге речь не идет. Немного изучив монитор, обнаружил, что от датчика к монитору данные передаются по радиоканалу 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 топик в стандартном виде:
Далее при помощи WB Engine Configuration отправляем это устройство обратно в HA, но уже в приличном виде:
и получаем в HA полноценное устройство:
В принципе задача выполнена, данные с датчика уровня воды перехватываются и отправляются на контроллер, где к ним есть постоянный доступ и можно писать историю наполнения, расходования и т.д.
Я далее в HA сделал вспомогательное устройство, которое на основании информации с датчика рассчитывает объем оставшейся воды и устройство, которое суммирует расход воды:
считаем высоту уровня воды, исходя из того, что мы знаем глубину колодца и высоту размещения датчика над максимальной плоскостью заполнения колодца водой.
зная диаметр кольца колодца - можно вычислить объем оставшейся воды в литрах.
ну и зная максимальную заполняемость колодца, можно вывести графику, которая будет одновременно содержать информацию об остатке в литрах и показывать уровень заполненности колодца (синяя полоска).
Так же теперь доступен контроль расхода воды и графики восполнения: