Найти тему
Smart home Russia

Считывание показаний счетчиков воды [v.2] + контроль протечки и температуры воды.

Наконец удалось реализовать вторую версию устройства для сбора показаний счетчиков воды. Добавил в нее функционала, реализовал интеграцию в home assistant.

Translation to English is here. Также основной канал в telegram.

Первая версия статьи вышла еще 2 года назад. Вместо предисловия оставлю на нее ссылку:

Статье почти 2 года, поэтому к оформлению и качеству подачи материала, даже у меня, есть вопросы.

Однако из нее можно понять тот факт, что у меня установлены импульсные счетчики. Каждые 10л воды они замыкают контакт геркона и тем самым отсчитывают потребление воды.

Кстати, если вы еще думаете, какой счетчик брать, то VALTEC при повторной поверке показал, что он все еще точен, а вот "Бетар" стал накручивать несколько дополнительных процентов. Хотя это может быть и не связано с качеством счетчика, а с качеством воды.

Разрабатывая вторую версию, предъявлял следующие требования:
1. Интеграция в HA
2. Датчик протечки
3. Контроль температуры

Все эти функции можно было смело реализовать и на первой версии, но уж больно дорого держать целую Arduino + ethernet шлюз. Поэтому вторую версию я делал уже на esp8266 и ESP Home. По цене - дешевле, по размерам - меньше, интеграция в HA- великолепная. Подробнее про них уже писал тут:

Начнем с устройства. Схема примитивная и паяется за час. Начнем с датчика температуры. Буду использовать ds18b20. Просто, потому что они у меня есть в достаточном количестве. Для них в ESP Home уже все готово:

Dallas Temperature Sensor

Датчик работает от 3.3В, поэтому делать дополнительно ничего не нужно. Одну ножку на плюс, другую на минус и дату на пин esp. Также резистором на 4,7кОм соединяем плюс и пин с данными.

Далее в ESP Home создаем строчку

dallas:
- pin: D7

Смотрим логи, находим в них информацию о коде датчика. Как нашли - копируем ее и добавляем. Адрес датчика, естественно, вписываем свой.

sensor:
- platform: dallas
address: 0x1c0000031edd2a28
name: "Temperature"

С температурой все, просто удлиняем линию данных до датчика и все готово. Теперь перейдем к датчику протечки и входам для счетчика. По сути — это просто бинарные входы. У бетара линия геркона синий и черный провод, у Valtec - белый и красный. Далее распаиваем все. D7 - температура, D6 - протечка, D1, D2 - счетчики. Протечка должна давать +3.3В и Gnd через резистор должна быть подключена в нормальном состоянии. Резистор обозначил на 4,7к, но подойдет почти любой, больше 2к и, думаю, до 1м. Можно и совсем без резистора, но я пока не играл с внутренней подтяжкой. И еще, даже если подключить счетчик между GND и входом МК, а подтяжку сделать к +3.3В, то работать все равно будет, но будет или отставать, или опережать на 1 импульс.

Сенсор протечки использовал такой же, как и в прошлый раз:

На этом все, теперь железо готово. Перейдем к коду:

esphome:
name: "bathroom-counter"
esp8266:
board: d1_mini
time:
- platform: sntp
id: my_time
logger:
api:
encryption:
key: "*тут будет сгенерирован ваш ключ*"
ota:
password: "
*тут будет сгенерирован ваш ключ*"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap:
ssid: "Esp Fallback Hotspot"
password: "
*тут будет сгенерирован ваш ключ*"
captive_portal:
web_server:
port: 80
preferences:
flash_write_interval: 1h
dallas:
- pin: D7
sensor:
- platform: dallas
address: 0xbc174e7612646128
name: "Hot water temperature"
- platform: integration
name: "Total cold"
id: cold_total
sensor: cold
time_unit: min
restore: true
min_save_interval: 1h
filters:
- offset: 406.425
- platform: integration
name: "Total hot"
id: hot_total
sensor: hot
time_unit: min
restore: true
min_save_interval: 1h
filters:
- offset: 204.523
# Hot water
- platform: pulse_counter
id: hot
pin: D1
unit_of_measurement: 'm3/min'
name: 'Hot water'
filters:
- multiply: 0.01
# Cold Water
- platform: pulse_counter
id: cold
pin: D2
unit_of_measurement: 'm3/min'
name: 'Cold water'
filters:
- multiply: 0.01
binary_sensor:
- platform: gpio
pin: D6
name: "Water leak sensor"
device_class: moisture

После запуска видим монитор по ip адресу и автоматическую интеграцию в HA.

Давайте теперь разберемся что это за код и что из него вам нужно. В основе лежат следующие компоненты:

Pulse Counter Sensor

Данный сенсор позволяет считать указанное количество импульсов за указанный период, по умолчанию:1 мин.

# Hot water
- platform: pulse_counter
id: hot
pin: D1
unit_of_measurement: 'm3/min'
name: 'Hot water'
filters: - multiply: 0.01

Вот, например, кусок кода для горячей воды.
В начале стоит комментарий. Нужен только для нас.
Первая строчка - платформа, которую используем. Ссылку на платформу уже оставлял выше.
Вторая - id, придумываем любой.
Третья - пин, к которому подключен счетчик.
Четвертая - отображаемая величина. Как я и говорил раньше, по умолчанию считаются импульсы в минуту, а счетчик мерит кубы. Поэтому величину я указал - кубы в час. Можно и в литрах мерить, кому что ближе.
Пятая - имя, которое будет отображаться для указанного сенсора. Может быть любым
Шестая - умножение на константу для получение корректного значения. т.к. счетчик говорит нам каждым импульсом о 10л воды, а в 1 м3 у нас 1000л, то для перевода л в м3 нужно умножить количество импульсов на 0.01. Нужно обратить внимание, что такой принцип не подойдет для счетчиков электроэнергии, т.к. там импульсы — это не всегда "путь", а иногда "скорость". т.е. некоторые счетчики через импульсы отдают потребление, а другие - скорость потребления. Когда я буду делать учет электроэнергии, то покажу разницу.

Следующий использованный компонент:

GPIO Binary Sensor

Данный компонент мы используем для определения протечки. пришло +3,3В на пин, значит протекло. Не пришло, значит все в порядке.

binary_sensor:
- platform: gpio
pin: D6
name: "Water leak sensor"
device_class: moisture

Тут все должно быть понятно, но я все же прокомментирую строчки:
1. У нас есть бинарные (т.е. 1 или 0, или правда или ложь) сенсоры.
2. Указываем, что наш сенсор — это физический разъем gpio у платы
3. Указываем что это пин D6 на плате и показания нужно брать именно с него.
4. Имя, может быть любым
5. Указываем тип нашего сенсора в ha. Мы указываем, что это датчик влажности. подробности можно, при желании, почитать тут:

Binary Sensor

Следующее, что мы должны сделать - проинтегрировать показания. Для этого у нас уже есть инструмент:

Integration Sensor

Интегрирование позволяет нам получить путь из скорости, или проще говоря, просуммировать все импульсы за указанный период. Вот код, который отвечает за интегрирование:

- platform: integration
name: "Total hot"
id: hot_total
sensor: hot
time_unit: min
restore: true
min_save_interval: 1h
filters:
- offset: 204.523

Опишем строчки уже привычным способом:
1. Указываем название платформы. Ссылка на нее и описание уже есть немного выше.
2. Указываем название. Любое, какое хочется
3. Указываем ее имя для того, чтобы использовать в других частях кода. Правда я так и не использовал, поэтому эту строчку можно исключить из кода
4. Указываем сенсор, который показывает скорость и показания которого мы и будем интегрировать. Я его уже описывал выше в разделе pulse counter sensor.
5. Важный момент, как часто мы будем интегрировать. Выше я уже писал, что стандартное время замера скорости - 1 раз в минуту, поэтому мы указываем скорость в кубах именно в минуту времени и поэтому в этом параметре мы также указываем минуту.
6. Пункт, который говорит, а нужно ли хранить показания в энергонезависимой памяти? Естественно, мы ставим да, иначе после сброса питания будем считать все с самого начала
7. Время сохранения. Я поставил 1 раз в час. Тут есть нюанс. Чем чаще мы будем сохранять, тем быстрее мы выведем из строя память нашей платы, чем реже мы будем сохранять - тем выше шанс у нас потерять данные при внезапной пропаже электричества.
8. Указываем, что данные нужно отфильтровать, а не использовать сырыми
9. Указываем начальную точку отсчета. В нашем случае — это текущие показания счетчика. После компиляции прошивки и заливки ее в ESP, именно с этой точки начнется стартовый отсчет потребления воды. Подробнее про другие варианты преобразования результата написано тут:

Sensor Component

На этом все, вроде как я рассказал все подробности, схему и постарался объяснить, что и зачем использовал. Если остались вопросы, то пишите все в комментариях, я постараюсь ответить / дополнить / учесть в следующих статьях.

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

UPD1: Выложил некоторые документы по счетчикам и датчику тут. Вдруг кому-то пригодится.

Подпишитесь, чтобы не пропускать следующий контент.
Нажмите лайк, если интересно, так я пойму какие публикации больше нужны моей публике.

Также публикации можно найти на других площадках: Instagram, telegram (RU, EN, DE), Medium, LiveJournal, YouTube.

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