Cчетчик газа в Home Assistant без паяльника

  • Tutorial

Не так давно мне пришел счёт за газ от которого стало не по себе, и я решил интегрировать обычный счетчик газа в свой умный дом на базе Raspberry Pi + Home Assistant, чтобы прогнозировать стоимость расходов и получать предупреждения сразу же как только расход начинает превышать ожидания.

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

Есть довольно интересная статья 2014 года об оптическом снятии показаний с любого счетчика с помощью смартфона, но в ней ни слова ни о Home Assistant вообще ни о его компоненте для оптического распознавания счетчиков в частности.

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

Читая эти и другие статьи (например статью 2018 года про Вотериус, или статью 2020 года Умная хрущёвка на максималках) я понял, что счетчики делятся не на два поколения (offline и online), а на три. Помимо 3-го поколения счетчиков, которое умеет отправлять показания счетчика куда надо, есть еще 2-е, которое само передавать данные по сети не умеет, но снабжено передатчиком импульсов (оптических или магнитных), позволяющим подключить к счетчику модуль, который эти импульсы считывает и передает дальше.

Погуглив свой счетчик газа (им оказался BK-G4) я с радостью обнаружил не только то, что генератор магнитных импульсов в него встроен (магнитик на барабане младшего разряда), но и даже то, что уже есть успешные примеры его интеграции в Home Assistant.

Однако перед тем как заказывать специализированный (герконовый) датчик импульсов IN-Z61 (1640р с доставкой, устанавливается в специально предусмотренную для него выемку в корпусе счётчика), плату esp8266 (788р с доставкой), паяльник, олово, канифоль, ждать пока все это приедет, а потом канифолиться с этим конструктором, я решил проверить гипотезу, нельзя ли решить задачу существенно проще и дешевле.

Удача улыбнулась мне, и вместо недели ожидания и нескольких тысяч расходов, я в тот же день интегрировал счетчик в Home Assistant обычным датчиком открытия двери Xiaomi (модель MCCGQ01LM), горсть которых когда-то приобрел на Авито по 600р за штуку.

Стоит заметить, что не снимая корпус с платы датчика, подбор положения в котором датчик справляется со считыванием импульсов требует усилий. Батарейки говорят на долго не хватит, хотя у меня за месяц-два использования не закончилась и новые продаются на AliExpress около 20р за штуку.

Для того чтобы завести счетчик в Home Assistant первым делом я создал сам счетчик в configuration.yaml

counter:
  gas_counter:
    step: 10

и добавил в automations.yaml автоматизацию которая увеличивает его значение в

- id: '1606010744418'
  alias: Gas count
  description: ''
  trigger:
  - entity_id: binary_sensor.openclose_gas
    platform: state
    from: 'on'
    to: 'off'
  action:
  - data:
      entity_id:
      - counter.gas_counter
    service: counter.increment

Затем добавил в configuration.yaml строку utility_meter: !include utility_meter.yaml, а в файл utility_meter.yaml следующие сущности, собирающие значения счетчика газа по интервалам (месяц, день, час)

gas_monthly:
  source: sensor.gas_counter_sensor
  cycle: monthly
  tariffs:
    - single
gas_daily:
  source: sensor.gas_counter_sensor
  cycle: daily
  tariffs:
    - single
gas_hourly:
  source: sensor.gas_counter_sensor
  cycle: hourly
  tariffs:
    - single

и уже на основе этих сущностей создал сенсоры, которые превращают кубометры в рубли

- platform: template
  sensors:
    gas_counter_sensor:
      friendly_name: "Показания счетика газа"
      unit_of_measurement: 'М3'
      value_template: "{{ (states('counter.gas_counter') | float) / 1000 }}"
      icon_template: mdi:counter
- platform: template
  sensors:
    gas_last_month:
      friendly_name: "Стоимость газа (прошлый месяц)"
      unit_of_measurement: '₽'
      value_template: "{{ ((state_attr('sensor.gas_monthly_single', 'last_period') | float) / 1000 * 6056.4) | round(2) }}"
      icon_template: mdi:cash-100
- platform: template
  sensors:
    gas_this_month:
      friendly_name: "Стоимость газа (этот месяц)"
      unit_of_measurement: '₽'
      value_template: "{{ ((states('sensor.gas_monthly_single') | float) / 1000 * 6056.4) | round(2) }}"
      icon_template: mdi:cash-100
- platform: template
  sensors:
    gas_today:
      friendly_name: "Стоимость газа (сегодня)"
      unit_of_measurement: '₽'
      value_template: "{{ ((states('sensor.gas_daily_single') | float) / 1000 * 6056.4) | round(2) }}"
      icon_template: mdi:cash-100
- platform: template
  sensors:
    gas_yesterday:
      friendly_name: "Стоимость газа (вчера)"
      unit_of_measurement: '₽'
      value_template: "{{ ((state_attr('sensor.gas_daily_single', 'last_period') | float) / 1000 * 6056.4) | round(2) }}"
      icon_template: mdi:cash-100
- platform: template
  sensors:
    gas_this_hour:
      friendly_name: "Стоимость газа (текущий час)"
      unit_of_measurement: '₽'
      value_template: "{{ ((states('sensor.gas_hourly_single') | float) / 1000 * 6056.4) | round(2) }}"
      icon_template: mdi:cash-100
- platform: template
  sensors:
    gas_last_hour:
      friendly_name: "Стоимость газа (прошлый час)"
      unit_of_measurement: '₽'
      value_template: "{{ ((state_attr('sensor.gas_hourly_single', 'last_period') | float) / 1000 * 6056.4) | round(2) }}"
      icon_template: mdi:cash-100
- platform: template
  sensors:
    gas_hour_based_monthly_estimate:
      friendly_name: "Прогноз стоимости (час->месяц)"
      unit_of_measurement: '₽'
      value_template: "{{ ((state_attr('sensor.gas_hourly_single', 'last_period') | float) / 1000 * 6056.4 * 24 * 30) | int }}"
      icon_template: mdi:chart-line-variant
- platform: template
  sensors:
    gas_day_based_monthly_estimate:
      friendly_name: "Прогноз стоимости (день->месяц)"
      unit_of_measurement: '₽'
      value_template: "{{ ((state_attr('sensor.gas_daily_single', 'last_period') | float) / 1000 * 6056.4 * 30) | int }}"
      icon_template: mdi:chart-line-variant

Чтобы счетчик не убил SD карту на которой бегает Home Assistant в кратчайшие сроки, и интерфейс Home Assistant не вешался при открытии состояния датчика, отключил датчику историю, добавив в configuration.yaml

recorder:
  exclude:
    entities:
      - binary_sensor.openclose_gas

После перезагрузки Home Assistant остаётся только ввести в систему текущее показание счетчика

У данного решения есть существенный минус, при каждой перезагрузке Home Assistant система будет пропускать часть импульсов, но прогнозировать стоимость расходов за месяц на основе расходов за час (или за день) это фактически не мешает, как и получать предупреждения о скачке расходов.

А для того чтобы в конце месяца автоматически посчитать точную фактическую стоимость расходов (например чтобы скинуть их арендодателю) достаточно скорректировать показания (если расхождения появились) за день до конца месяца.

Комментарии 13

    +1
    Можно ещё проще и надёжнее. У ESP32 на борту имеется встроенный датчик Холла. Он более чувствителен, чем сяомишный геркон. И ESPhome про этот датчик знает. Попутно можно подключить MQ-4, который будет на предмет утечек газа сигнализировать.
    С питанием надо только что-то пошаманить.
      0
      В отличие от датчика Xiaomi ESP32 явно не поместится в гнездо счетчика. Хватит ли чувствительности датчика Холла для чтения импульсов на таком расстоянии?
      +1
      Удача улыбнулась мне, и вместо недели ожидания и нескольких тысяч расходов, я в тот же день интегрировал счетчик в Home Assistant обычным датчиком открытия двери Xiaomi, горсть которых когда-то приобрел на Авито по 600р за штуку.

      Тема сисек раскрыта не полностью. Что за датчик Сяоми (если у них не одна модель) и что внутри счётчиков (для тех, кому достаточно 2..3 печатных слов, но лень/не удобно идти по ссылке).


      Заголовок спойлера

      На барабане младшего разряда — магнитик. В корпусе счётчика — место для установки герконового(?) датчика. Конструктив — выглядит похожим на датчики пневмоавтоматики (Camozzi, etc.).

        0
        Спасибо за замечание, дополнил статью
        0
        ну вот кончится месячный лимит газа, и что всё перекрыть его и не готовить пищу, одни булки с чаем? Может счет за газ пришел вообще по ошибке и надо пойти скорректировать?..
        З.Ы. У моего друга мама свихнулась на электричестве: у них в щитке муть этих проводов, и они ленятся вызвать электрика разобраться какой куда, но есть сомнения что их провода идут только к ним… И так, если прийти в гости то будет тьма. Если зажечь лампочку более чем на 2мин будет сразу крик «ты что не экономишь!!!» (это энергоэффективную 15 ваттную), а то что в квартире при этом работает 500ватт комп с Танками она не понимает )). Естественно когда она уходит все лампочки сразу зажигаются и начинается нормальная жизнь…
        Помнить постоянно про батарейку в каком то датчике, да и просто иметь какие то датчики и знать о них и проверять — это вообще странно выглядит. ;)
          0
          Весь смысл мероприятия в том чтобы
          1. На основе стоимости последнего часа прогнозировать стоимость месяца и в случае появления непредвиденного расхода выявить и устранить его источник до того как он намотал огромный счет. В квартире это не актуально, так как газ расходуется только на плите, а в большом доме со сложной системой газового отопления есть где возникнуть сюрпризам.
          2. Завести все это в Home Assistant, где можно создать автоматизации, которые предупредят и о том что батарейку пора менять, и о том что расход газа вдруг подскочил и о чем угодно еще.
            0
            расход газа вдруг подскочил


            Если расход газа вдруг подскочил — это заметят сразу. Газ это не электричество, утечку можно унюхать и без приборов. Если автоматика в котле решила вместо 60 градусов давать 80 — это тоже сразу заметно. Откуда может взяться вдруг?
              +1
              В доме довольно сложная система отопления, в которой много переменных. Можно менять маршрут по которому идет теплоноситель, минуя или задействуя часть насосов. Можно по разному распределять нагрузку между бассейном и самим домом. Существенный вклад вносит температура за бортом и открытие/закрытие окон (необходимо для контроля влажности и уровня углекислого газа, частично делается автоматически, частично вручную). Задним числом причину «вдруг» достоверно установить не удалось. С появлением мониторинга проблема не возвращалась (по крайней мере в таких масштабах)
          +1
          Меня всегда удивлял в импульсных счётчиках один вопрос — где гарантии что импульс правильно посчитается? Возможно в случае с микроконтроллером, у котороого вход по прерыванию и есть некоторые гарантии, но в случае с малиной и тем более непонятным bluetooth/zigbee датчиком у меня нет полной уверенности, что импульс не будет пропущен. Или есть какие-то секреты на этот счёт?
            0
            Спасибо за вопрос, добавил в статью.

            Да, при каждой перезагрузке Home Assistant система будет пропускать часть импульсов, но прогнозировать стоимость расходов за месяц на основе расходов за час (или за день) это фактически не мешает, как и получать предупреждения о скачке расходов.

            А для того чтобы в конце месяца автоматически посчитать точную фактическую стоимость расходов (например чтобы скинуть их арендодателю) достаточно скорректировать показания (если расхождения появились) за день до конца месяца.
            +2

            На ESP32 Cam, без герконов, без датчиков Холла, без пропуска импульсов, без пайки:
            https://github.com/jomjol/AI-on-the-edge-device
            Считывает и цифры, и стрелки (если у кого есть).

              0
              А пошагового руководства на русском, с картинками случайно нету? :)
                +1
                я в шоке — оптическое распознавание на esp32:
                image

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

              Самое читаемое