Интегрируем электросчетчик в систему умного дома — АСУ ТП: сообщество инженеров

Интегрируем электросчетчик в систему умного дома

Интегрируем электросчетчик в систему УД

Описанное в статье устройство для самостоятельной сборки (далее — MQTT-счетчик) предназначено для тех, кто хотел бы иметь в системе домашней автоматизации информацию о потребляемой домохозяйством энергии, при этом, не меняя электросчетчик на «умный», не вмешиваясь в его конструкцию, не нарушая пломбировку, да и вообще не трогая провода под напряжением в электрощитке.

Метод измерения количества импульсов контрольного светодиода счетчика, на котором основано это устройство, не позволяет определить никакие другие параметры электросети — ни силу тока, ни напряжение, ни текущую мощность, а только количество потреблённой энергии.

Для обмена данными с системой домашней автоматизации устройство использует беспроводную сеть WiFi и протокол MQTT.

MQTT-счетчик отличается элементарной конструкцией и очень простым программным кодом. Для сборки и прошивки не требуется никаких специальных навыков, а при наличии особых умений можно обойтись даже без паяльника.

Принцип работы

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

Например, надпись 3200 имп / кВт·ч (3200 imp/kWh) обозначает, что за время потребления 1 киловатт-часа энергии (который эквивалентен работе нагрузки мощностью 1кВт в течение 1 часа), светодиод на счетчике загорится и погаснет 3200 раз. На практике это займет больше или меньше времени, в зависимости от количества и мощности включенных в данный момент электроприборов.

Зная указанное число, мы можем посчитать, какому количеству потребленной энергии соответствует 1 импульс индикатора (1кВт·ч делим на 3200), или несколько импульсов.

Зная время измерения, мы также можем посчитать что-то типа мощности — значение расхода энергии за заданный промежуток.

Для реализации подобной схемы измерения нам потребуется датчик, чувствительный к уровню освещенности и микроконтроллер, способный сосчитать количество импульсов и передать их в систему домашней автоматизации.

Конструкция

MQTT-счетчик состоит из двух компонентов:

  1. Недорогой платформы Wemos D1 Mini на базе микроконтроллера ESP8266.
  2. Аналогового датчика уровня освещенности TEMT6000 (по сути — фототранзистора).

Датчик освещенности закрепляется поверх светодиода домового электросчетчика (например, скотчем), сигнальный выход датчика подключается к аналоговому входу Wemos.

Платформа получает питание для работы по порту MicroUSB, при старте подключается к домашней сети WiFi 2,4 ГГц, далее к указанному MQTT-брокеру (серверу) передает данные о подсчитанном количестве импульсов.

Особенности работы

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

Поэтому в приведенном варианте счётчик выполняет всего две функции:

  1. Подсчет количества импульсов светодиода.
  2. Отправка этих данных по сети WiFi на MQTT-сервер, интегрированный в систему умного дома.

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

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

Каким образом это работает?

MQTT-счетчик при включении выполняет следующие действия:

  1. Соединяется с заданной сетью WiFi.
  2. Соединяется с заданным MQTT-сервером.
  3. Подписывается на входной топик, определяющий его дальнейшие действия, назовем его топиком конфигурации.
  4. Начинает считать импульсы, фиксируемые датчиком освещенности.

При получении сообщения из топика конфигурации, MQTT-счетчик выдает в ответ подсчитанное им на момент получения сообщения количество импульсов и обнуляет внутренний счетчик, начиная новый цикл отсчета.

Сообщение, отправленное в топик конфигурации счетчика, должно состоять из адреса топика, в который MQTT-счетчик вернет подсчитанное им количество импульсов.

Эта схема позволяет:

Настроить нужную частоту снятия данных, отправляя сообщения в топик конфигурации с заданной в системе автоматизации периодичностью — ну, например, вы можете отправлять счетчику сообщения раз в минуту, раз в пять минут, раз в час, или один раз в сутки.Произвести первичное разделение данных. Вы можете отправлять сообщение счетчику всего два раза в сутки — в момент смены временных тарифных зон. При этом, если в сообщении будут указаны соответствующие адреcа, счетчик вернет количество импульсов, посчитанных для каждой тарифной зоны в свой топик. Остается пересчитать эти импульсы в киловатт-часы и умножить на тарифную ставку.

В моем же случае реализована следующая схема:

  1. Счетчик получает сообщение от системы автоматизации в топик конфигурации раз минуту.
  2. Во время действия разных тарифных зон адрес топика в сообщении разный.
  3. Для получения сквозных суточных данных по энергопотреблению в системе автоматизации существует сущность, суммирующая данные с этих двух топиков.
  4. Для расчета общей стоимости электроэнергии в системе автоматизации полученные импульсы суммируются каждый по своему топику и умножаются на тариф.

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

Ну и вот что в итоге получается:

Пример вывода полученных данных в Home Assistant

Вместо заключения

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

Источник: https://sprut.ai/client/article/2184

🔗 Интегрируем электросчетчик в систему умного дома

Оставьте комментарий

Войти

Зарегистрироваться

Сбросить пароль

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

Прокрутить вверх