Когда я начал автоматизировать свой умный дом, одной из целей было отслеживание потребления электроэнергии. Казалось бы, задача простая — в интернете хватает готовых решений. Многие из них легко интегрируются в Home Assistant и работают «из коробки». Но есть нюанс: учёт по нескольким тарифам (день, ночь, пик) найденные решения не полноценно поддерживают.
После тестирования нескольких конфигураций я пришёл к выводу — проще сделать своё решение, которое будет учитывать текущий тариф в статистике. Так появился этот проект: умный счётчик Tuya с Zigbee и интеграцией в Home Assistant с поддержкой многотарифного учёта электроэнергии.
В этой статье я расскажу, как всё настроил: от подключения счётчика до реализации логики учёта по тарифам. Потратил на это немало времени, но теперь система работает стабильно, и ею удобно пользоваться.
Основные задачи, которые я решал:
поддержка нескольких тарифов (пик, полупик, ночь);
возможность корректировки значений через интерфейс Home Assistant;
устойчивость к кратковременным сбоям (перезапуск сервера с Home Assistant, обрыв Zigbee-сети и т.д.);
защита от аномальных скачков значений — например, если счётчик внезапно вернёт некорректные данные.
Система была отлажена на Home Assistant версии 2025.7.

Оборудование
Для измерения потребления я выбрал однофазный счётчик Tuya с токовым трансформатором (около 1900 руб.). Он измеряет основные параметры — напряжение, ток и потреблённую энергию, передаёт данные по Zigbee и отлично интегрируется с Home Assistant.

Я специально отказался от модели с экраном — в щитке уже есть основной счётчик с дисплеем, а дублировать показания смысла не вижу.
Установка максимально простая: токовый трансформатор надевается на фазный провод сразу после основного счётчика — и начинает фиксировать общее потребление электроэнергии в доме. Само устройство тоже подключается к питанию. Хотя схема подключения несложная, для безопасности я всё же рекомендую доверить монтаж квалифицированному электрику.

После установки устройство просто добавляется в экосистему Tuya. Для работы по протоколу Zigbee потребуется соответствующий хаб.
У счётчиков с токовыми трансформаторами могут быть небольшие отклонения в измерениях. Но это не проблема — через приложение можно выполнить калибровку, чтобы данные стали точнее.

Home Assistant
Для добавления счетчика в Home Assistant, я использую интеграцию с Tuya (Настройки → Устройства и службы → Интеграции). Через неё в Home Assistant доступны данные большинства устройств, которые добавлены в систему Tuya.

После появления счетчика в системе необходимо добавить следующий код конфигурации. Для данного кода можно создать отдельный packages/energy.yaml
или добавить в основной configuration.yaml
input_number:
energy_t1:
name: "Energy T1"
unit_of_measurement: "kWh"
min: 0
max: 100000
step: 0.01
mode: box
energy_t2:
name: "Energy T2"
unit_of_measurement: "kWh"
min: 0
max: 100000
step: 0.01
mode: box
energy_t3:
name: "Energy T3"
unit_of_measurement: "kWh"
min: 0
max: 100000
step: 0.01
mode: box
energy_last_meter:
name: "Предыдущее значение энергии"
unit_of_measurement: "kWh"
min: 0
max: 100000
step: 0.01
В этом коде мы добавляем поля для ввода значений текущего значения энергии (t1, t2, t3) и плюс в energy_last_meter
будем хранить общее накопленное значение нашим счетчиком (это будет чисто технический параметр для работы конфигурации).

Далее создадим сенсоры (energy_t1_sensor
, energy_t2_sensor
, energy_t3_sensor
), из которых будет выводиться информация об энергии. Можно этот код не добавлять, а использовать input_number созданные выше, но тогда значения будут показываться не в виде текста, а как поле для ввода данных, что не всегда красиво выглядит в интерфейсе.
template:
- sensor:
- name: "Energy T1 sensor"
unique_id: "energy_t1_sensor"
unit_of_measurement: "kWh"
device_class: energy
availability: "{{ states('input_number.energy_t1') not in ['unknown', 'unavailable'] }}"
state: "{{ states('input_number.energy_t1') | float(0) }}"
- name: "Energy T2 sensor"
unique_id: "energy_t2_sensor"
unit_of_measurement: "kWh"
device_class: energy
availability: "{{ states('input_number.energy_t2') not in ['unknown', 'unavailable'] }}"
state: "{{ states('input_number.energy_t2') | float(0) }}"
- name: "Energy T3 sensor"
unique_id: "energy_t3_sensor"
unit_of_measurement: "kWh"
device_class: energy
availability: "{{ states('input_number.energy_t3') not in ['unknown', 'unavailable'] }}"
state: "{{ states('input_number.energy_t3') | float(0) }}"
Далее в файле automations.yaml
или в блоке automation: основного конфигурационного файла, задаём автоматизацию по переключению тарифов:
- alias: "Accumulation of consumption by tariffs"
trigger:
- platform: time_pattern
minutes: "/1"
variables:
current_energy: "{{ states('sensor.zigbee_dual_meter_total_energy') | float(0) }}"
last_energy: "{{ states('input_number.energy_last_meter') | float(0) }}"
energy_delta: "{{ current_energy - last_energy }}"
current_tariff: >
{% set hour = now().hour %}
{% if 7 <= hour < 10 or 17 <= hour < 21 %}
t1
{% elif 23 <= hour or hour < 7 %}
t2
{% else %}
t3
{% endif %}
input_number_entity: "input_number.energy_{{ current_tariff }}"
condition:
- condition: numeric_state
entity_id: sensor.zigbee_dual_meter_total_energy
above: 0
action:
- choose:
- conditions:
- condition: template
value_template: "{{ 0 < energy_delta < 1 }}"
sequence:
- service: input_number.set_value
target:
entity_id: "{{ input_number_entity }}"
data:
value: >
{{ (states(input_number_entity) | float(0)) + energy_delta }}
- service: input_number.set_value
target:
entity_id: input_number.energy_last_meter
data:
value: "{{ current_energy }}"
Представленный код запускается каждую минуту и сравнивает текущее накопленное значение счетчика current_energy
с предыдущим last_energy
. Если energy_delta
больше нуля, то в переменной current_tariff
определяется текущий тариф в зависимости от времени суток и на основе него, будет определено значение переменной input_number_entity
куда нужно прибавить полученную energy_delta
.
Данные о потребляемой мощности берутся с сенсора счётчика sensor.zigbee_dual_meter_total_energy
.
На основе текущего времени суток определяется активный тариф:
T1 — с 7:00 до 10:00 и с 17:00 до 21:00;
T2 — с 23:00 до 7:00;
T3 — во все остальные часы.
Также мы фильтруем данные, значение energy_delta
должно быть в диапазоне от 0 до 1 кВт/ч, если выше, то его отбрасываем. Иногда бывают выбросы показателей и не отфильтровав значение, мы испортим статистику, да и в квартире/доме потребление 1 кВт/ч за 1 минуту невозможно.
После этого мы присваиваем input_number_entity
полученное значение, а также в поле energy_last_meter
устанавливаем current_energy
, чтобы сравнивать при следующем изменении показателя счетчика.
Данная конфигурация позволяет устанавливать и корректировать текущие значения уже потребленной энергии через интерфейс Home Assistant, и задать временные интервалы переключения тарифов.
Дополнительно датчики можно вывести на дашборд Energy, где красиво отобразить потребляемую энергию.

Заключение
Созданная система работает надёжно даже при кратковременных сбоях связи или перезапуске Home Assistant. Она даёт точную картину потребления по каждому тарифу, а при необходимости значения можно вручную скорректировать через интерфейс.

Другие полезные конфигурации для умного дома и обзоры умных устройств, можно найти в моём Tg канале.
Комментарии (20)
xaxexa
13.08.2025 15:02А подключится к счётчику через его интерфейс не?
linux2000 Автор
13.08.2025 15:02Потенциально самое удобное решение. Но придется искать кастомную схему под многообразие счетчиков.
xSVPx
13.08.2025 15:02У вас более одного счетчика ?
Их по-моему вообще всего несколько штук. И скорее всего все одинаково инфу дают.
deadlypotato
13.08.2025 15:02Есть единый стандарт доступа к счётчикам электроэнергии через оптопорт (МЭК 1107)
MxMaks
13.08.2025 15:02У штатного счетчика порты запломбированы и энергосбытом крайне не одобряется к ним подключаться. Но следом ставится свой счетчик, а с него по rs485 например считывается все, что угодно и напряжения и токи и импульсы считать не надо, все выдает в привычных цифрах. То есть да)
pruwait
13.08.2025 15:02Первое, что пришло в голову при прочтения статьи. Лет 5 назад к своему меркурию прикрутил esp8266 с can-трансивером, залил еsphome и вижу в ha ровно то, что считает счетчик. Все платы куплены на али и стоили рублей 300 в сумме.
Отдельная сложность с подключением к опломбированному счётчику.
Вызываем электриков для переопломбирования с формулировкой "нужно подтянуть контакты"
Приезжают электрики, заполняют акт снятия пломб, подключаем за пару минут 4 проводка к клеммам данных от счетчика, электрики опломбируют снова.
VladimirZhabin
13.08.2025 15:02utility_meter для подсчёта использовать надёжнее и проще. Там встроена защита от сброса счётчика, некорректных данных и прочее. Можно завести разные: четверть часа, час, день, неделя, месяц, год.
Недавно мы сделал интересную автоматизацию: за 15 минутные интервалы измеряем количество потребляемой воды. Если больше 50л (это кому как нравится) то посторонний расход воды, например залила кнопка унитаза в туалете. Пользование душа и ванной не в счёт.
linux2000 Автор
13.08.2025 15:02Делал такую конфигурацию на utility_meter, но отказался из-за того, что если сбой/перезагрузка сервера приходит на момент переключение тарифа, то тариф соответственно не меняется до наступления следующей смены тарифа. Хотя возможно, где-то просто не доработал конфигурацию.
И за идею проверки утечки воды спасибо, тоже думал как лучше это реализовать, и эта схема прям хорошая.
avshkol
13.08.2025 15:02Также мы фильтруем данные, значение
energy_delta
должно быть в диапазоне от 0 до 1 кВт/ч, если выше, то его отбрасываем. Иногда бывают выбросы показателей и не отфильтровав значение, мы испортим статистику, да и в квартире/доме потребление 1 кВт/ч за 1 минуту невозможно.кВт×ч, если речь идёт о приращении энергии. Нужно иметь мощность потребления 60 кВт, чтобы за 1 минуту потребить 1 кВтч. Физлиц обычно подключают с мощностью до 15 кВт.
linux2000 Автор
13.08.2025 15:02Просто пока пару месяцев отлаживал конфигурацию, были аномальные всплески потребления, поэтому добавил защиту.
rustydroid
13.08.2025 15:02Есть системы отслеживающие какой прибор включился по частотам (гармоникам) и переходным процессам в сети. Когда-то я давно читал, но не смог найти. Типа такого https://habr.com/ru/companies/milandr/articles/540714/ но у ребят было работающее железо и софт. В любом случае можно погуглить power disaggregation и идти думать о пересмотре концепции мониторинга ;)
MxMaks
13.08.2025 15:02Есть и защитные реле на дин рейку например уздп, по гармоникам определяют искрение контактов у потребителя и отключают линию.
vesowoma
Часы в коммерческом счетчике живут обычно своей собственной жизнью, встречал разницу с фактическим временем и 15 минут, и почти час. Так что в деньгах показания будут не совпадать.
linux2000 Автор
Да, плюс и токовый трансформатор имеет погрешности, поэтому точно считать деньги будет сложно.
Но в целом моя задача была, убрать необходимость каждый месяц смотреть показатели в щитке для передачи в энергокомпанию, и тут погрешность в несколько квт/ч выглядит допустимой.
MxMaks
Вообще не мониторю потребление и не сдаю показания. Автоплатеж энергосбыт считает по среднему расходу, а раз в полгода контролер энергосбыта сам приходит и списывант данные счетчика, при расхождениях или доп списание или ложится на баланс остаток
theult
Совместно с токовым трансформатором используется логика, чтобы погрешность снизить к допустимым значениям. Большинство производителей электросчётчиков используют измерительные трансформаторы, логика позволяет входить в классы 1S, 0.5S или 0.1S (погрешность до 1%, 0,5% и 0,1% соответственно). Поэтому если подопытный позиционируется производителем как прибор учёта электроэнергии, точность должна быть не ниже бытовых однопроцентных счётчиков. По корректному времени, возможно, имеет смысл ввести поправку на время счётчика. Смену тарифов с таким костылем можно подвинуть на несколько минут раньше или позже.
Более сложный, долгий, нудный и точный способ - использовать оптоголовку для счётчика, на вашем есть оптопорт.