Pull to refresh

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

Level of difficultyEasy
Reading time5 min
Views10K

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

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

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

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

Tags:
Hubs:
Total votes 20: ↑20 and ↓0+26
Comments23

Articles