Подошел срок очередной поверки газового счетчика и было принято решение заменить его на счетчик с импульсным выходом. Задача оказалась нетривиальная, так как было жесткое ограничение по параметрам присоединения. Но, слава маркетплейсам, не проходит и недели как заветный гаджет попадает мне в руки.
Умный счетчик природного газа
В руководстве по эксплуатации имеем следующую информацию:
Спасибо производителю - теперь у нас есть все, чтобы подобрать подходящий счетчик импульсов.
Обустройством DIY умного дома я занимаюсь уже не первый год. Сейчас имею такую конфигурацию:
Raspberry Pi 4 (4GB RAM) с Home Assistant OS на борту;
Zig Star LAN в качестве координатора для Zigbee сети;
Порядка 90 Zigbee и 10 Wifi устройств.
У меня уже был реализован подсчет потребления холодной воды посредством счетчика импульсов Zigbee (Счетчик импульсов Zigbee — modkam.ru). В последнее время этот счетчик стал отваливаться от сети, но проблема не в самом устройстве, а в его расположении, но об этом чуть позже.
Подключив это счетчик импульсов к новому газовому счетчику я (вот сюрприз!) не получил адекватных показаний. Причина - он считывает, как мне ответил в комментариях разработчик устройства, ~1 имп/сек. Мы же имеем в даташите и на устройстве - 1 импульс = 0,000125 м3.
Нехитрая математика:
8000 импульсов за один куб;
2,73 м3/час максимальный расход газа у котла;
8000 х 2,73 / 3600 получаем около 6 импульсов в секунду.
Дальнейший поиск решения естественно привел меня к ESPHome. По железу выбор пал на ESP32 DEVKIT V1.
На плате уже есть все что нужно, и разъем питания MicroUSB, и Wifi, и торчащие пины - можно “наколхозить” на коленке без паяльника что угодно.
Изучив документацию на сайте по Pulse Counter Sensor (Pulse Counter Sensor — ESPHome) и помучив Chat GPT получилась такая конфигурация:
esphome:
name: gas-count
friendly_name: gas_count
esp32:
board: esp32dev
framework:
type: arduino
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: ******
# Блок для ввода фактических значений показаний из интерфейса HA
actions:
- service: set_pulse_total_gas
variables:
new_pulse_total: float
then:
- lambda: |-
id(saved_total_gas_consumption) = new_total;
ESP_LOGD("custom", "Set total gas consumption to: %f", id(saved_total_gas_consumption));
ota:
- platform: esphome
password: *******
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Gas-Count Fallback Hotspot"
password: ********
captive_portal:
globals:
- id: saved_total_gas_consumption # Глобальная переменная для сохранения данных при перезагрузке устройства
type: float
restore_value: true
initial_value: '0.0'
sensor:
- platform: pulse_counter
pin: GPIO04
id: gas_meter_counter
name: "Gas Meter Pulse Count"
unit_of_measurement: "pulses"
accuracy_decimals: 1
filters:
- debounce: 10ms # Игнорировать сигналы, которые длятся менее 10 мс. По даташиту длительность импульса от 2 до 6 мс.
- multiply: 0.000125 # Применение коэффициента для пересчета импульсов в м³
- lambda: |-
id(saved_total_gas_consumption) += x;
return id(saved_total_gas_consumption);
# Выводим значения глобальной переменной в HA
- platform: template
name: "Saved Total Gas Consumption"
device_class: gas
lambda: |-
return id(saved_total_gas_consumption);
unit_of_measurement: "m³"
accuracy_decimals: 6
Конструктивные комментария/замечания категорически приветствуются, так как я далекий от программирования человек и буду рад советам профессионального сообщества.
Согласно руководству по эксплуатации импульсный выход счетчика - открытый коллектор. Счетчик подключал по такой схеме:
Разъем для подключения импульсного счетчика - TRS 3.5 (мини джек)
Загрузив прошивку на ESP32 получил в интерфейсе HA такие сенсоры:
И такие красивые картинки на панели Энергия в HA:
Умный счетчик воды
Получив положительный опыт я решил заменить счетчик импульсов Zigbee холодной воды на ESP32. У Zigbee очень много плюсов, но в моем случае именно в месте расположения счетчика воды что-то пошло не так. Добиться стабильной работы устройства я не смог.
Помимо снятия показаний со счетчика холодной воды на вводе в квартиру я также снимаю показания со специально установленного счетчика перед фильтром обратного осмоса для корректного учета ресурсов мембраны и остальных картриджей.
Код для ESPHome:
esphome:
name: water-count
friendly_name: water_count
esp32:
board: esp32dev
framework:
type: arduino
# Подключение к Wi-Fi сети
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Water-Count Fallback Hotspot"
password: *******
captive_portal:
# Enable Home Assistant API
api:
encryption:
key: *******
# Блок для ввода фактических значений показаний из интерфейса HA
services:
- service: set_water_total
variables:
new_total: float
then:
- lambda: |-
id(saved_total_water_consumption) = new_total;
ESP_LOGD("custom", "Set total water consumption to: %f", id(saved_total_water_consumption));
- service: set_filter_water_total
variables:
new_total: float
then:
- lambda: |-
id(saved_total_filter_water_consumption) = new_total;
ESP_LOGD("custom", "Set total filter water consumption to: %f", id(saved_total_filter_water_consumption));
ota:
- platform: esphome
password: *******
# Веб-сервер для диагностики
web_server:
port: 80
# Логирование
logger:
# Глобальные переменные для хранения количества литров
globals:
- id: saved_total_water_consumption
type: float
restore_value: True
initial_value: '0.0'
- id: saved_total_filter_water_consumption
type: float
restore_value: True
initial_value: '0.0'
# Настройка для счетчика воды
sensor:
- platform: pulse_counter
pin:
number: GPIO14 # Пин счетчика воды
mode:
input: true
pullup: true
id: water_meter_counter # ID счетчика воды
name: "Water Meter"
unit_of_measurement: "pulses"
accuracy_decimals: 1
filters:
- multiply: 10 # Применение коэффициента для пересчета импульсов в литры. 1 импульс - 10 литров
- lambda: |-
id(saved_total_water_consumption) += x;
return id(saved_total_water_consumption);
# Настройка для счетчика перед фильтром
- platform: pulse_counter
pin:
number: GPIO27 # Пин счетчика воды перед фильтром
mode:
input: true
pullup: true
id: filter_water_meter_counter # ID счетчика перед фильтром
name: "Filter Water Meter"
unit_of_measurement: "pulses"
accuracy_decimals: 1
filters:
# Для счетчика перед фильтром коэффициент не применяю, т.к. 1 импульс у него равен 1 литру.
- lambda: |-
id(saved_total_filter_water_consumption) += x;
return id(saved_total_filter_water_consumption);
# Выводим значения глобальных переменных в HA
- platform: template
name: "Saved Total Water Consumption"
device_class: water
lambda: |-
return id(saved_total_water_consumption);
unit_of_measurement: "L"
accuracy_decimals: 1
- platform: template
name: "Saved Total Filter Water Consumption"
device_class: water
lambda: |-
return id(saved_total_filter_water_consumption);
unit_of_measurement: "L"
accuracy_decimals: 1
В документации ESPHome по поводу подключения выходов с геркона написано следующее:
inverted: true я ставить не стал, т.к. четкой информации на счетчики я не нашел. Решил оставить так и, в случае некорректных показаний я бы это исправил. Не потребовалось.
По итогу оба сенсора прекрасно залетели в HA и без проблем отображаются на панели Энергия:
Ну а учет ресурса фильтра обратного осмоса выглядит так:
При нажатии на иконку фильтра выскакивает окно и можно сбросить ресурс при замене картриджа:
Результатом я остался доволен. Теперь мой дом стал еще немного умнее, а 25 числа каждого месяца в телеграм приходят уведомления с показаниями всех счетчиков.