Подключение газового счетчика к HomeAssistant. Часть 1

Пришло время менять газовый счетчик в доме. В качестве нового газового счетчика был выбран cBKP G4 (аналог ELSTER), На младшем регистре (крайнее правое кольцо) установлен маленький магнит у него, а также к нему датчик импульсов IN-Z61 совместим для газовых счетчиков ВК, ВКР, МК, SG. Максимальное напряжение 24 В постоянного тока, с максимальным током до 50 мА. Минимальное время замкнутого контакта внутри счетчика 0.25 секунды, а сопротивление всего 0.5 Ома.

Я не стал изобретать очередной велосипед, выбрал готовое решение. Чтобы вся конструкция смотрелась как цельная.

Также нам потребуется : ESP-WROOM-32 DevKit  модуль с помощью, которого мы будет передавать по wifi связи показания счетчика в HomeAssistant. Остановился именно на нем (до этого перепробовал ESP8266/D1 Mini), но он показал себя более стабильным в работе.  Распиновка модуля ниже

Теперь все делаем пошагово.

Прошиваем ESP WROOM-32 и получаем наши сенсоры в ESPHOME

Вкратце как работает счетчик импульсов. Мы будем использовать всего 2 провода от него: это зеленый и коричневый. При поднесении магнита к самому датчику импульса срабатывает замыкание их, это есть 1 импульс равный 0.01м3 газа. Работает вообщем как обычный геркон. 

Для ESP WROOM-32 используем два контакта GND, например D18 (GPIO18). Для ESP8266 можно использовать контакты с D5 и GND. Соот-но питание у всех 3.3В.  Для первой прошивки этого модуля нам потребуется простейший программатор USB-to-TTL. Я использую такой.

Прошивать будем через компьютер на котором установлен Home Assistant (через порт USB). Далее обновлять прошивку уже будем удаленно по Wifi. При программировании ESP WROOM-32 питание у него будет от программатора. 

USB-to-TTL ESP WROOM-32
RX <-> TX0
TX <-> RX0
3.3V <-> 3.3V
GND <-> GND

Далее нам потребуется приложение ESPHOME в Home Assistant. Он должен быть уже установлен в вашей системе. Создаем новый проект в нем.

 

 

Создался наш проект.

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

  • input_number.Z16_meter_number счетчик показаний с возможностью “калибровки” данных
  • бинарный сенсор binary_sensor.gaz_z16_live_impuls счетчик импульсов (On-Off)
  • кнопку перезагрузки модуля ESP button.gaz_z16_restart_device
esphome:
  name: gasmeter
  friendly_name: GAZ
  comment: GAS ESP controller

esp32:
  board: esp32dev

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "AjA8hjZXs8v2chQ+Dpj4bfJYRmkjZds6mLJ8xGFVvFQ="

ota:
  password: "3b1a5d64830479a3c190d138744796"
  safe_mode: true
  reboot_timeout: 10min
  num_attempts: 5

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  fast_connect: true

# Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: !secret wifi_ssid_reserve
    password: !secret wifi_password_reserve

captive_portal:

web_server:
  port: 80
  version: 2
  local: true

substitutions:
  pin_gas_counter: GPIO18
  device_name: "Z16"

number:
  - platform: template
    name: "${device_name}"
    id: Z16_meter_number
    device_class: gas
    icon: "mdi:fire"
    mode: box
    optimistic: true
    unit_of_measurement: 'm³'
    min_value: 0
    max_value: 99999.999    
    step: 0.01
    restore_value: yes

binary_sensor:
  - platform: gpio
    id: internal_pulse_counter_gas
    pin:
      number: ${pin_gas_counter}
      mode: INPUT_PULLUP
      inverted: true
    name: "${device_name} Live-Impuls"
    filters:
     - delayed_on: 100ms
    on_press:
      then:
        - number.increment: Z16_meter_number

button:
# Restart the ESP
  - platform: restart
    name: "${device_name} - Restart Device"

 Фактически нам нужны будут значения только от input_number.Z16_meter_number в Home Assistant для передачи их в Utility Meter (подсчета показаний за день, месяц и год). Вы можете использовать и второй сенсор испульсов binary_sensor.gaz_z16_live_impuls (он находиться в состоянии ‘off’ (Не обнаружен), когда нет импульса. Когда магнит в счетчике замкнет, геркон сенсор перейдёт в состояние ‘on’ (Обнаружен). При переходе из состояния ‘on’ в ‘off’ (или наоборот, но только в одну сторону) надо будет прибавлять к нашему счетчику 0,01 м3.). У меня все эти вычисления делает первый input_number.Z16_meter_number (он умеет как накапливать показания так и менять их в онлайне для корректировки). На ваш выбор.

 еще немного кода сенсоров: аптайм, IP адрес и SSID сети wifi.

text_sensor:
  - platform: template
    name: uptime_Z16
    id: uptime_Z16
    icon: mdi:clock-start
    update_interval: 60s

  - platform: wifi_info
    ip_address:
      name: IP Address
      id: ip
    ssid:
      name: Connected SSID
      id: ssid

sensor:
  - platform: uptime
    name: uptime_sensor
    id: uptime_sensor
    update_interval: 60s
    internal: true
    on_raw_value:
      then:
        - text_sensor.template.publish:
            id: uptime_Z16
            state: !lambda |-
                      int seconds = round(id(uptime_sensor).raw_state);
                      int days = seconds / (24 * 3600);
                      seconds = seconds % (24 * 3600);
                      int hours = seconds / 3600;
                      seconds = seconds % 3600;
                      int minutes = seconds /  60;
                      seconds = seconds % 60;
                      return (
                        (days ? to_string(days)+":" : "00:") +
                        (hours ? to_string(hours)+":" : "00:") +
                        (minutes ? to_string(minutes)+":" : "00:") +
                        (to_string(seconds))
                      ).c_str();

Начинаем прошивать. На ESP жмем Boot (или Flash) и не отпуская подключаем по USB шнурку нашу связку USB-to-TTL – ESP WROOM-32 к компьютеру, как только питание появилось на ESP – отпускаем Boot и в ESPHOME нашего проекта жмем

 

выбираем наш USB-to-TTL (его имя)

 

Ждем окончания процесса. Он может быть долгим. Не забываем, что на вашем Wifi роутере должен быть разрешен доступ для подключения к Wifi сети клиенских устройств. После того как все удачно прошло (ниже успешный лог прошивки)

нажать на модуле ESP WROOM-32 кнопку EN (у некоторых она может быть с другим именем RST или RESET), по разному

и если вы увидите в логе IP адрес ESP WROOM-32 устройства полученного по DHCP (или на вашем роутере посмотреть), то подключаемся к нему по IP в браузере и видим что-то подобное

Показания пока все на нулях. В логах ничего пока нет. Отключаем от компа наш программатор и ESP WROOM-32 и подключаем датчик импульсов IN-Z16 к ESP согласно таблице распиновки

IN-Z16 ESP
коричневый GND
зеленый D18

Если поднести магнит к датчику импульсов то сработают Z16 Live-Impuls из “off” переключиться в “On”, и в Z16 в state будут в браузере видны мгновенные показания с шагом 0.01. Делаем так несколько раз. Если все хорошо и показания увеличиваются, то собственно можно подключать датчик к газовому счетчику.

Далее обновлять наш скетч уже можно через Wifi выбирая в меню Wirelessly

Рекомендую с Linux система которой настроек докер с Home Assistant прописать в /etc/hosts локальные DNS наши хосты с IP адресами:

192.168.1.30  gasmeter.local gasmeter

На этом физика завершена. Датчик подготовлен для работы с Home Assistant, в следующей части разберем детально его подключение и работу с Utility Meter.

5 2 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

7 комментариев
Популярные
Новые Старые
Межтекстовые Отзывы
Посмотреть все комментарии
Pavel
Pavel
31.07.2023 16:27

Добрый день, отличная инструкция. Переделал по ней свою устаревшую инсталяцию. А где вторая часть?)

Oleg
Oleg
08.08.2023 08:48

Спасибо за статью, сделал по вашей инструкции, но наблюдаю разницу в показаниях. Может обрывы сети какие-то. Нельзя ли сделать, кол-во импульсов хранились в памяти esp, а при восстановлении сети, передавались в HA?

Олег
Олег
31.08.2023 08:07

Когда продолжение? Не хватает ума настроить Utility Meter. При ребуте eps home отчет начинается с нуля.

Олег
Олег
31.08.2023 13:05
Ответить на  Олег

Сделал вот такой шаблон, сбрасывается в ноль при получении новых данных, а не накапливает

sensor:
      - name: "Показания газа"
        unit_of_measurement: "m³"
        icon: "mdi:fire"
        device_class: 'gas'
        state_class: 'total_increasing'
        state: >
          {% set  power_total = states('number.gazcouter_z61') | float %}
          {{ power_total }}
7
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x