Интегрируем электросчетчик в систему УД
Описанное в статье устройство для самостоятельной сборки (далее — MQTT-счетчик) предназначено для тех, кто хотел бы иметь в системе домашней автоматизации информацию о потребляемой домохозяйством энергии, при этом, не меняя электросчетчик на «умный», не вмешиваясь в его конструкцию, не нарушая пломбировку, да и вообще не трогая провода под напряжением в электрощитке.
Метод измерения количества импульсов контрольного светодиода счетчика, на котором основано это устройство, не позволяет определить никакие другие параметры электросети — ни силу тока, ни напряжение, ни текущую мощность, а только количество потреблённой энергии.
Для обмена данными с системой домашней автоматизации устройство использует беспроводную сеть WiFi и протокол MQTT.
MQTT-счетчик отличается элементарной конструкцией и очень простым программным кодом. Для сборки и прошивки не требуется никаких специальных навыков, а при наличии особых умений можно обойтись даже без паяльника.
Принцип работы
Возможность получения данных о потреблённой энергии обусловлена наличием на типовых электросчетчиках контрольного индикатора — светодиода, мигающего чаще или реже, в зависимости от интенсивности потребления электрической энергии. Так называемое передаточное число счётчика указано рядом с индикатором и сообщает количество импульсов, которые выдаст светодиод за время потребления определенного количества энергии.
Например, надпись 3200 имп / кВт·ч (3200 imp/kWh) обозначает, что за время потребления 1 киловатт-часа энергии (который эквивалентен работе нагрузки мощностью 1кВт в течение 1 часа), светодиод на счетчике загорится и погаснет 3200 раз. На практике это займет больше или меньше времени, в зависимости от количества и мощности включенных в данный момент электроприборов.
Зная указанное число, мы можем посчитать, какому количеству потребленной энергии соответствует 1 импульс индикатора (1кВт·ч делим на 3200), или несколько импульсов.
Зная время измерения, мы также можем посчитать что-то типа мощности — значение расхода энергии за заданный промежуток.
Для реализации подобной схемы измерения нам потребуется датчик, чувствительный к уровню освещенности и микроконтроллер, способный сосчитать количество импульсов и передать их в систему домашней автоматизации.
Конструкция
MQTT-счетчик состоит из двух компонентов:
- Недорогой платформы Wemos D1 Mini на базе микроконтроллера ESP8266.
- Аналогового датчика уровня освещенности TEMT6000 (по сути — фототранзистора).
Датчик освещенности закрепляется поверх светодиода домового электросчетчика (например, скотчем), сигнальный выход датчика подключается к аналоговому входу Wemos.
Платформа получает питание для работы по порту MicroUSB, при старте подключается к домашней сети WiFi 2,4 ГГц, далее к указанному MQTT-брокеру (серверу) передает данные о подсчитанном количестве импульсов.
Особенности работы
Конкретно эта версия MQTT-счетчика была разработана специально для сообщества sprut.ai, состоящего из множества людей с разными условиями энергопотребления, счетчиками, схемами тарификации, да и к тому же, использующих различные программные платформы домашней автоматизации (Home Assistant, Node-Red и т. д.).
Поэтому в приведенном варианте счётчик выполняет всего две функции:
- Подсчет количества импульсов светодиода.
- Отправка этих данных по сети WiFi на MQTT-сервер, интегрированный в систему умного дома.
Вся дальнейшая работа с подсчитанным количеством импульсов, в том числе их накопление, перевод в привычные единицы измерения, организация учёта за разные периоды, может и должна выполняться средствами самой системы домашней автоматизации.
При этом, сам счетчик не имеет фиксированного временного периода выдачи количества импульсов, что крайне нетипично для подобных решений. Периодичностью выдачи счётчиком данных и их первичным разделением управляет система домашней автоматизации.
Каким образом это работает?
MQTT-счетчик при включении выполняет следующие действия:
- Соединяется с заданной сетью WiFi.
- Соединяется с заданным MQTT-сервером.
- Подписывается на входной топик, определяющий его дальнейшие действия, назовем его топиком конфигурации.
- Начинает считать импульсы, фиксируемые датчиком освещенности.
При получении сообщения из топика конфигурации, MQTT-счетчик выдает в ответ подсчитанное им на момент получения сообщения количество импульсов и обнуляет внутренний счетчик, начиная новый цикл отсчета.
Сообщение, отправленное в топик конфигурации счетчика, должно состоять из адреса топика, в который MQTT-счетчик вернет подсчитанное им количество импульсов.
Эта схема позволяет:
Настроить нужную частоту снятия данных, отправляя сообщения в топик конфигурации с заданной в системе автоматизации периодичностью — ну, например, вы можете отправлять счетчику сообщения раз в минуту, раз в пять минут, раз в час, или один раз в сутки.Произвести первичное разделение данных. Вы можете отправлять сообщение счетчику всего два раза в сутки — в момент смены временных тарифных зон. При этом, если в сообщении будут указаны соответствующие адреcа, счетчик вернет количество импульсов, посчитанных для каждой тарифной зоны в свой топик. Остается пересчитать эти импульсы в киловатт-часы и умножить на тарифную ставку.
В моем же случае реализована следующая схема:
- Счетчик получает сообщение от системы автоматизации в топик конфигурации раз минуту.
- Во время действия разных тарифных зон адрес топика в сообщении разный.
- Для получения сквозных суточных данных по энергопотреблению в системе автоматизации существует сущность, суммирующая данные с этих двух топиков.
- Для расчета общей стоимости электроэнергии в системе автоматизации полученные импульсы суммируются каждый по своему топику и умножаются на тариф.
P. S. Можно работать и с одним топиком, проводя все расчеты в системе автоматизации, разделяя данные по времени и суммируя их уже там, но лично у меня с этим как-то не срослось — видимо, я еще недостаточно хорошо знаю возможности Home Assistant. Но я был бы рад увидеть Вашу статью о подобном варианте.
Сборка
Компоненты для MQTT-счетчика можно заказать на алиэкспрессе или купить в России. Общая стоимость ~350 рублей. Вместо Wemos D1 Mini можно использовать любой другой ESP8266.
С соединением компонентов все проще некуда, см. схему ниже:
Прошивка
Прошивать Wemos мы будем с помощью Arduino IDE.
Подробно описывать процесс я не буду, можно воспользоваться инструкцией по прошивке из предыдущей статьи (раздел «Прошивка часов»). Но в этот раз нам понадобится только одна внешняя библиотека — PubSubClient — для работы с MQTT-протоколом.
ВАЖНО! Библиотеку PubSubClient.h после установки надо будет найти на диске и немного отредактировать (в ОС Windows путь к библиотеке обычно выглядит типа С:Users*Username*DocumentsArduinolibrariesPubSubClientsrcPubSubClient.h). Нужно увеличить в ней значение MQTT_KEEPALIVE до 120, иначе MQTT-брокер (по крайней мере, в Home Assistant) будет сбрасывать подключение клиента каждые 15 секунд.
После того, как все библиотеки установлены и отредактированы, загружаем скетч для MQTT-счетчика и открываем файл .ino в Arduino.
В начале скетча Вам надо будет заменить название и пароль к Wi-FI сети, а также адрес и параметры подключения к MQTT-серверу на свои. Плюс нужно указать топик конфигурации, откуда счетчик будет получать данные.
const char* wifiNetwork = "NetworkName"; const char* wifiPassword = "NetworkPassword"; IPAddress mqttServer(192, 168, 1, 100); const char* clientName = "NRG Meter v0.99"; const char* mqttUser = "mqttBrokerUser"; const char* mqttPassword = "mqttBrokerPassword"; const char* mqttInTopic = "sensors/nrg/config"; SHELLКОПИРОВАТЬ
Сохраняем скетч, выбираем в платах свой Wemos и прошиваем его.
Осталось только подать на нее питание, закрепить датчик на светодиоде счетчика и … настроить систему домашней автоматизации для работы с полученными данными.
Пример интеграции с Home Assistant
Сразу скажу, что пример далеко не идеальный, но это все же только пример возможного использования полученных со счетчика данных.
Итак, я собираю данные по двум тарифным временным зонам, и у меня в configuration.yaml создан логический переключатель для этого, который на всякий случай выведен и в интерфейс HA:
input_select:
nrg_mode:
name: Текущая тарифная зона
options:
- День
- Ночь
icon: mdi:brightness-4 YAMLДалее переходим к автоматизациям.
Тарифная зона переключается по времени. В топик неактивной после переключения временной зоны принудительно публикуется ноль.
- id: 'nrg_night_on'
alias: Включение ночной тарифной зоны
hide_entity: false
initial_state: True
trigger:
- platform: time
at: "23:00:10"
action:
- service: input_select.select_option
data:
entity_id: input_select.nrg_mode
option: Ночь
- service: mqtt.publish
data:
topic: 'sensors/nrg/count/day'
payload: '0'
- id: 'nrg_day_on'
alias: Включение дневной тарифной зоны
hide_entity: false
initial_state: True
trigger:
- platform: time
at: "07:00:10"
action:
- service: input_select.select_option
data:
entity_id: input_select.nrg_mode
option: День
- service: mqtt.publish
data:
topic: 'sensors/nrg/count/night'
payload: '0'YAMLНиже пример автоматизации для публикации сообщения в топик конфигурации MQTT-счетчика. У меня она происходит раз в минуту, при изменении системного таймера. Топик, куда счетчик вернет количество импульсов, зависит от положения логического переключателя.
- id: 'energy_mode_publish'
alias: Публикация тарифа для электросчетчика
initial_state: true
hide_entity: false
trigger:
platform: state
entity_id: sensor.time
action:
service: mqtt.publish
data_template:
topic: "sensors/nrg/config"
payload: >-
{% if is_state("input_select.nrg_mode", "День") %}
sensors/nrg/count/day
{%-elif is_state("input_select.nrg_mode", "Ночь") %}
sensors/nrg/count/night
{% endif %}
retain: false
qos: 1 YAMLДля обработки полученных от счетчика в ответ сообщений надо создать сенсоры в файле configuration.yaml:
Сенсоры входящих MQTT-сообщений для двух топиков (параметр force_update: true обязателен)
sensor:
- platform: mqtt
name: Э/э ночь
unit_of_measurement: 'имп.'
state_topic: "sensors/nrg/count/night"
force_update: true
- platform: mqtt
name: Э/э день
unit_of_measurement: 'имп.'
state_topic: "sensors/nrg/count/day"
force_update: true
YAMLПлюс сенсоры статистики для сбора данных с этих сенсоров:
sensor:
- platform: statistics
entity_id: sensor.e_e_den
name: day_stats
sampling_size: 525600
- platform: statistics
entity_id: sensor.e_e_noch
name: night_stats
sampling_size: 525600
- platform: statistics
entity_id: sensor.e_e_den
name: day_stats_per_month
sampling_size: 44640
- platform: statistics
entity_id: sensor.e_e_noch
name: night_stats_per_month
sampling_size: 44640JAVASCRIPTКОПИРОВАТЬПервые два считают статистику за год (525600 минут), вторые два — только за месяц. (Обратите внимание — не с начала текущего месяц, а просто за месяц назад от текущего момента. Да, такая статистика актуальна только к концу месяца).
Также я добавляю сенсоры на базе шаблонов для суммирования импульсов по дневной и ночной зоне для построения общего графика расхода, сенсоры для извлечения из сенсоров статистики суммарных количеств импульсов и перевода их в более привычные величины, сенсоры для вычисления стоимости электроэнергии и текущих значения показаний квартирного электросчетчика:
sensor:
energy_total_impulses:
friendly_name: "Мгновенное потребление"
value_template: "{{ states('sensor.e_e_den') | int states('sensor.e_e_noch') | int }}"
unit_of_measurement: 'Имп.'
energy_total_watts_per_hour:
friendly_name: "Потребление электроэнергии"
value_template: "{{ ( ((states('sensor.energy_total_impulses') | int ) / 3.2 ) * 60 ) | round (0) }}"
unit_of_measurement: 'Вт·ч'
energy_day_meter:
friendly_name: "День"
unit_of_measurement: 'кВт·ч'
value_template: "{{ (( state_attr('sensor.day_stats', 'total') | int) / 3200 3751 ) | round (0)}}"
energy_night_meter:
friendly_name: "Ночь"
unit_of_measurement: 'кВт·ч'
value_template: "{{ (( state_attr('sensor.night_stats', 'total') | int ) / 3200 1310 ) | round (0)}}"
###### РАСХОД ДНЕМ И НОЧЬЮ ЗА МЕСЯЦ #######
energy_day_total_per_month:
friendly_name: "День"
unit_of_measurement: 'кВт·ч'
value_template: "{{ (( state_attr('sensor.day_stats_per_month', 'total') | int ) / 3200 ) | round (2) }}"
energy_night_total_per_month:
friendly_name: "Ночь"
unit_of_measurement: 'кВт·ч'
value_template: "{{ (( state_attr('sensor.night_stats_per_month', 'total') | int ) / 3200 ) | round (2) }}"
###### СТОИМОСТЬ ЗА МЕСЯЦ #######
energy_cost_per_month:
friendly_name: "Стоимость за месяц"
value_template: "{{ (((( state_attr('sensor.day_stats_per_month', 'total') | int ) / 3200 ) | round(0) ) * 3.84 ((( state_attr('sensor.night_stats_per_month', 'total') | int ) / 3200 ) | round(0) ) * 2.22) | round (2)}}"
unit_of_measurement: 'руб.'
YAMLНу и вот что в итоге получается:
Вместо заключения
В статье был рассмотрен принцип измерения и передачи в систему умного дома данных о потребленной домашней электросетью энергии, а также была приведена схема сборки и прошивки устройства, реализующего его. Похожую схему можно применить и для решения других задач, например, подсчета расхода горячей и холодной воды со счетчиков с импульсным выходом.
Источник: https://sprut.ai/client/article/2184