Счетчики газа и воды на ESP32 в Home Assistant

от автора

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

Умный счетчик природного газа

В руководстве по эксплуатации имеем следующую информацию:

Схема импульсного выхода "открытый коллектор"

Схема импульсного выхода «открытый коллектор»
Разъем TRS 3.5 "мини джек"

Разъем TRS 3.5 «мини джек»

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

Обустройством DIY умного дома я занимаюсь уже не первый год. Сейчас имею такую конфигурацию:

  1. Raspberry Pi 4 (4GB RAM) с Home Assistant OS на борту;

  2. Zig Star LAN в качестве координатора для Zigbee сети;

  3. Порядка 90 Zigbee и 10 Wifi устройств.

Главная страница

Главная страница
Управление отоплением и ГВС

Управление отоплением и ГВС

У меня уже был реализован подсчет потребления холодной воды посредством счетчика импульсов Zigbee (Счетчик импульсов Zigbee — modkam.ru). В последнее время этот счетчик стал отваливаться от сети, но проблема не в самом устройстве, а в его расположении, но об этом чуть позже. 

Подключив это счетчик импульсов к новому газовому счетчику я (вот сюрприз!) не получил адекватных показаний. Причина — он считывает, как мне ответил в комментариях разработчик устройства, ~1 имп/сек. Мы же имеем в даташите и на устройстве — 1 импульс = 0,000125 м3.

Нехитрая математика:

  1. 8000 импульсов за один куб;

  2. 2,73 м3/час максимальный расход газа у котла;

  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 числа каждого месяца в телеграм приходят уведомления с показаниями всех счетчиков.  


ссылка на оригинал статьи https://habr.com/ru/articles/849422/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *