Интеграция счетчика тепла в Home Assistant

Изначально застройщиком в квартире был установлен счетчик тепла Пульс СТК-15-М с интерфейсом Meter-Bus (M-bus). Поиски в Интернете не дали простого ответа как удаленно считывать показания.

Примерно через 3,5 года эксплуатации на счетчике закончилась батарейка (наверное я слишком часто нажимал кнопку активации экрана/перебора параметров) и также подходил срок поверки. Стоимость поверки с демонтажом/монтажом, заменой батарейки и пломбировкой не сильно отличается от стоимости нового счетчика, поэтому было принято решение о покупке нового счетчика Пульс СТК-15-И с интерфейсом типа токовая петля по ГОСТ IEC 61107–2011.

С этим счетчиком все гораздо проще: он выдает один импульс на 1 кВт*ч потребленной тепловой энергии (0,001 Гкал, хотя строго говоря должно быть 1 Гкал = 1163 кВт·ч https://ru.wikipedia.org/wiki/Калория). Недостаток этого варианта счетчика — не передаются дополнительные параметры: температуры теплоносителя, скорость потока и т.д. Для получения температуры теплоносителя дополнительно используются 2 датчики температуры DS18B20.

Железо:

  • Плата ESP8266 NodeMCU V3

  • Датчики температуры DS18B20 2шт.

  • Резистор номиналом от 4 до 10 кОм

Схема соединения элементов

Схема соединения элементов

Красный провод счетчика подключен к пину RX платы ESP8266, черный к GND. Датчики температуры прикреплены к входящему/исходящему трубопроводам рядом со счетчиком.

Прошивка — ESPHome.

JAML конфигурация:

substitutions:
  plug_name: shw
  dlspin: GPIO13 #D7
  ledpin: GPIO2 #D4
  htcpin: GPIO3 #RX
  
esphome:
  name: uc-shw

esp8266:
  board: nodemcuv2

# Enable logging
logger:
  level: WARN

# Enable Home Assistant API
api:

ota:
  password: "******************************"

wifi:
  ssid: !secret wifi_ssid2
  password: !secret wifi_password2

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "UC-Shw Fallback Hotspot"
    password: "************"

captive_portal:

web_server:
  port: 80

dallas:
  - pin: $dlspin 
    update_interval: 10s
  
sensor:
  - platform: uptime
    name: ${plug_name}_uptime

  - platform: wifi_signal
    name: ${plug_name}_wifi_signal
    update_interval: 10s
    
  - platform: dallas
    address: 0xe53c01e07693fa28
    name: ${plug_name}_heat_temp_in

  - platform: dallas
    address: 0xba3c01e0769c4b28
    name: ${plug_name}_heat_temp_out
  
  - platform: pulse_counter
    pin: 
      number: $htcpin
      inverted: true
      mode:
        input: true
        pullup: true
    name: ${plug_name}_pulses_heat
    accuracy_decimals: 0
    id: pulse_heat
             
  - platform: integration
    name: ${plug_name}_pulses_heat_integr
    sensor: pulse_heat
    time_unit: min
    id: pulses_heat
    accuracy_decimals: 0
    unit_of_measurement: kWh
    restore: true
    
text_sensor:
  - platform: wifi_info
    ip_address:
      name: ${plug_name}_ip
    ssid:
      name: ${plug_name}_ssid
    mac_address:
      name: ${plug_name}_mac
  - platform: version
    name: ${plug_name}_version
    
status_led:
  pin: $ledpin

В Home Assistant в configuration.yaml создадим utility_meter для накопления информации о потребленной тепловой энергии за день, неделю, месяц, год:

    utility_meter:
      daily_heating:
        source: sensor.shw_pulses_heat_integr
        cycle: daily
        
      weekly_heating:
        source: sensor.shw_pulses_heat_integr
        cycle: weekly
        
      monthly_heating:
        source: sensor.shw_pulses_heat_integr
        cycle: monthly
        
      yearly_heating:
        source: sensor.shw_pulses_heat_integr
        cycle: yearly

Также создадим Template сенсор для пересчета собранных импульсов в реальные показания счетчика, т.к. изначально были уже не нулевые показания. В моем случае это выглядит так:

sensor:
  - platform: template

      heat_real:
              friendly_name: "Показание счетчика тепла"
              unit_of_measurement: 'GCal'
              value_template: >
                {{(states('sensor.yearly_heating')|float*0.001 + 0.384) | round(3)}}

В итоге в Home Assistant видим следующую информацию:

Отображение показаний счетчика в Home Assistant

Отображение показаний счетчика в Home Assistant

Кроме того, к данному микроконтроллеру подключены датчик температуры горячей воды на DS18B20, датчик движения на HC-SR501, датчик температуры/влажности на AHT10, считаются импульсы с выхода счетчика воды Пульс 15УИ-80 и планируется управление подсветкой зеркала. Но это уже другая история.

© Habrahabr.ru