Андрей Смирнов
Время чтения: ~12 мин.
Просмотров: 5

Велосипед из энергомонитора PZEM004T и ESP8266, с Народным мониторингом

Задался я вопросом — куда девается ток из проводов? Вроде топим дом газом, в доме все лампы диодные, посудомойку включаем в ночь, бани с электропечкой пока нет, а электричество все время куда-то девается. Непорядок. Надо бы за ним проследить. Добро пожаловать под кат…

Первый шаг — общий мониторинг потребления

Задачи

Я решил затеять охоту на стадо зайцев. Зайцами были выбраны:

  • Мониторинг электросети через интернет. Моментальный контроль параметров сети у меня присутствует — в коридоре, в щитке есть энергомонитор PZEM061, на экране можно увидеть напряжение, ток и мощность. А вот на месте отображения потребляемой энергии — какая-то абстракция, слишком мало разрядов. Но в коридоре не удобно. Хочу на экране телефона.
  • График потребления электричества. Хотелось бы узнать когда же возникает чрезмерное потребление?
  • Показания счетчика через интернет. Это боль — передача показаний счетчика в энергосбыт. Передавать им показания надо с 15 по 25 число месяца. Я об этом часто забываю и они начинают звонить роботом и писать спамом. При этом когда они о себе напоминают — я как правило на работе, а счетчик у меня на столбе на улице. Хочу на экране телефона.
  • Мониторинг температуры стабилизатора. В нашей деревне зимой больше 200в на входе в дом не бывает, доходит до 140в. Поэтому у меня на есть стабилизатор на 12кВт, но при таких параметрах и длительной нагрузке от 2кВт и с учетом расположения стабилизатора в нише стены — стабилизатор перегревается и отключается, пришлось добавить пару вентиляторов (с ними температура остается в допустимых пределах) — ранее они были включены постоянно, сейчас под замес — поставил термостаты KSD9700 на 65гр, ждем зимы. Следить за этим параметром я не хочу, т.к. влиять на него не могу. Но после добавления термостатов — надо проконтролировать результат.

Железо

Для решения поставленных задач было выбрано:

  • PZEM004T — энергомонитор с UART. Позволяет получать параметры электросети — один параметр раз в 0.6сек: напряжение, ток, мощность, потребленную энергию, а так же не нужные мне частоту и коэффициент мощности. Используется с измерительным трансформатором 1:1000.
  • ESP8266 NodeMCU — универсальный микроконтроллер с WiFi, по размеру хорошо сочетается с PZEM004T — можно соединить стойками с использованием имеющихся отверстий на платах. Так же на плате NodeMCU есть полезная кнопка Flash (соединена с GPIO0) — ее удобно использовать для управления режимом работы — например для включения SoftAP.

С учетом того, что девайс будет размещен в металлическом корпусе стабилизатора — припаял на ESP внешнюю антенну. Пытался запитать ESP от PZEM004T (подпаяв провода к круглому конденсатору — на нем примерно 7в) — не получилось, при подключении ESP напряжение просаживается до 2в. Но в стабилизаторе уже есть БП на 5в — для вентиляторов, значит он и будет использован (я думал он на 12в, поэтому долго мучился, чтоб подключить к нему ESP — не работало ни в какую, перепробовал кучу DC-DC преобразователей, пока не перевернул БП и не прочитал на нем надписи).568syzaphx5e7gg62uqjuyjqkua.png

Прошивка

Посмотрел имеющиеся в сети. Как обычно не нашел подходящей и решил написать свою. За базу взял свой же проект для реле Sonoff (простейший функционал, по HTTP и по кнопке включается и выключается, больше ничего не умеет; используется совместно с MacroDroid для щадящего питания телефона c постоянно включенным экраном — у предыдущего от постоянного заряда аккумулятор вздулся и выдавил экран). Но кроме функционала реле, сборка имеет http сервер, настройки WiFi, NTP, работает с кнопкой GPIO0 — разные действия от длительности нажатия, моргает по-всякому лампочкой (например отсчет секунд нажатия кнопки, отражение состояния реле и WiFi)… Естественно несколько доработал настройки:6noy274t8yivlrtxybopipepba4.png Посмотрел имеющуюся библиотеку для работы с PZEM004T — не понравилось. Она отправляет запрос, а потом в замкнутом цикле ждет ответ. Не правильно это. Написал свою библиотеку, асинхронную — указываю ей из основной программы какие параметры хочу получить, а потом периодически проверяю, получены ли требуемые данные:Код

static PZEM004Tnb::flags flags = PZEM004Tnb::flags::all; static unsigned long lastReadEnergyTime = 0;  if (Pzem004t.isDataUpdated()) { setLedState(3); // радостно поморгаем по поводу получения данных  // ...  unsigned long currentTime = millis(); if ((currentTime - lastReadEnergyTime) > 6000) { // раз в 1 мин читаем счетчик flags = PZEM004Tnb::flags::all; lastReadEnergyTime = currentTime; }else{ flags = (PZEM004Tnb::flags)(PZEM004Tnb::flags::all ^ PZEM004Tnb::flags::energy); } } Pzem004t.updateData(flags);

Учел, что PZEM004T считает максимум 9999кВт*ч, потом сбрасывается — реализовал учет переполнений. Реализовал двухтарифный счет. Так же реализовал учет средних значений параметров — показания считываются примерно раз в 2сек, а на Народный мониториг надо передавать данные раз в 5мин, естественно средние. Добавил в систему работу с массивом датчиков DS18B20. Данные считываются поочередно с периодом 2сек на датчик. Т.е. ищем датчик, нашли — получаем данные, через 2сек ищем следующий и т.д. Кончились датчики — начинаем с начала. Т.е. при использовании только одного датчика период его опроса 4сек. Для этих датчиков так же сделан расчет средних значений. Актуальные данные энергомонитора можно получить по HTTP:l_ucjyu_dm6b55ovjt1dw2dapqe.png Все данные хранятся в целых числах, когда нужно (например при передаче в Народный мониториг) — в нужную позицию добавляется точка. Реализовал публикацию данных по протоколу MQTT/UDP. Добавил поддержку этого протокола и датчика PZEM004T в свой монитор: Это мой не удавшийся проект контроллера температуры (Фиаско. История одной самоделки IoT), который я решил оставить в качестве только монитора. Реализовал публикацию данных на Народном мониторинге: Ребятам из Народного мониторинга большой респект! Передача данных в сервис элементарна, есть средство возможность посмотреть поступающие данные для отладки взаимодействия, можно просто управлять данными датчиков. Система может строить зачетные графики (ниже — каша из графиков, просто пример): Так же есть возможность оповещения о состоянии датчиков (временно отключил передачу данных для теста): Естественно, добавил настройки публикации данных:

Итоги

В результате мониторинга в реальном времени уже отключил один из двух постоянно включенных миникомпьютеров, настроил на компьютере дитеныша гибернацию, в BD плеере (используется только для караоке) перенастроил режим сна. Когда наберется статистика для графиков — буду дальнейшие шаги предпринимать. Кто захочет заиметь себе такой энергомонитор — велкам в личку за прошивкой (Халява, сэр!).

P.S.

При разработке девайса столкнулся с мистикой — при питании ESP от USB компа, от любой зарядки телефона — все работает. При питании от встраиваемого БП — не работает. Привлек для расследования логический анализатор и симплескоп — питание от синего блока вроде в порядке, сигналы от ESP идут корректные, а обратно — тишина. Другой блок питания — все отлично работает. Методом научного тыка осознал, что когда я использую встраиваемый БП — я подключаю его к питанию PZEM004T, то есть в этом случае два устройства стартуют одновременно (с другими БП одновременное включение не возможно). А я для коммуникации использую аппаратный UART, на который ESP при старте выкидывает кучу мусора. PZEM004T не может это переварить при старте и зависает. Если же PZEM004T уже включен — старт ESP и мусор в порту он переживает без проблем. Решением стало использование SoftwareSerial, с ним все работает отлично.

P.P.S.

Для тех кто захочет сделать себе такой девайс (а такие герои есть!):Описание в каталоге устройств Народного мониторинга19 июля 2019, 18:14

Предыстория

Один из важных (относительно) аспектов в умном доме — это экономия. Электричества, воды, тепла… Нервов…

Ясное дело, что для того, что-бы что-то экономить, надо знать сколько ты на это что-то тратишь! В частности: вот есть одно-двух-трех тарифные системы оплаты электричества. Какая из них выгоднее тебе конкретно?! 

Раньше было просто: вот однотарифник, вот двух, где дневной точно такой, а ночью — дешевле… Потом ввели третий, который «полу-пик» и дешевле дневного, но дороже ночного… Понятное дело, что трех-тарифный был выгоднее: за пользование электричеством не в пиковое время ты платил просто меньшую сумму, а в пик — как все остальные!

А потом они начали вносить изменения в тарифы и дневной стал дороже одинарного, полу-пик стал как одиночный, а пик — чуть дороже дневного в двух-тарифной сетке… 

Запутались? Вот и я тоже! И решил я тогда выяснить, а что вот лично мне выгоднее?!

Ну и по совету знакомых, я приобрел PZEM-004, причем в варианте с индикаторами… К статье это отношение не имеет — модели идентичны, просто мне теперь мучиться еще с размещением его в щиток…

Ну и все это было бы проще, если бы некоторое время назад я не заболел ХоумАссистентом вообще, и прошивкой EspHome в частности… Для Ассистента она более удобная, но если нет полноценной поддержки чего-то — сушите весла! Добавить будет сложно!

Собственно цель была проста: берем PZEM-004, берем ESP (у меня был «бесхозный» esp32) и «впихуем невпихуемое» в Ассистента…

Подготовка

Проблема в том, что поддержка PZEM-004  там есть… Просто ее нет в общедоступной версии…

Что делать — нашёл в одном из пулл-реквестов (спасибо Дмитрию Цымбалу с Телеграмма за наводку)… Там это раскидано по сообщениям, так что постараюсь скомпоновать и пояснить мелочи.

Проблема была в том, что EspHome у меня стояло как отдельный сервер в виртуалке, а подходящий для решения проблемы ключ вводился в настройки для модуля к Ассистенту, так что — ставим как модуль.

Кто не в курсе:

  1. Переходим в Hass.io
  2. Addon store
  3. Добавить репозиторий https://github.com/esphome/hassio
  4. В нем — установить модуль EspHome
  5. Перед запуском — добавляем в конфиг строку   «esphome_version»: «pzem004t»
  6. Сохраняем конфиг и запускаем EspHome. Или перезапускаем…
  7. Ждем некоторое время — он подкачивает файлы и стартует не особо быстро.
  8. Открываем Web UI для EspHome и… Как им пользоваться — надеюсь уже в курсе?

Собственно, важен именно 5й пункт: мы принудительно заставляем его работать с той версией, в которую добрый дядя добавил поддержку PZEM!

Подключение — банально: GND-GND, RX-TX, TX-RX. На VCC можно забить: PZEM на него питание не выдает и ничего на нем от этого контакта не запитывается. Разве что на RX у ESP можно повесить килоомный резистор между ним и TX пином PZEM: у того логика пятивольтовая и у ESP может пригореть…

Код

В yaml файл для вашего ESP вносим примерно аналогичное, с поправкой на устройство и порт…

# В этой секции - понятно ваше название и платформа. esphome:   name: energo   platform: ESP32   board: esp-wrover-kit  # Да, да, три варианта сеток... Параноя... Что лучше будет ловить.  # У меня там дальше много чего в secrets.yaml - учитывайте у себя, если не используете... wifi:   networks:   - ssid: !secret net1     password: !secret net1_password   - ssid: !secret net2     password: !secret net2_password   - ssid: !secret net3     password: !secret net3_password   manual_ip:     static_ip: 192.168.2.13     gateway: 192.168.0.1     subnet: 255.255.252.0   reboot_timeout: 0s    logger:   hardware_uart: UART1    # EspHome любит кидать логи на UART. А нам он нужен для другого...  api:   password: !secret api_pass   reboot_timeout: 0s  ota:   password: !secret ota_pass  web_server:   port: 80  # Можете убрать этот кусок - просто со статусным удобнее... status_led:     id: light_module_status     pin:       number: GPIO2 #      inverted: True  # Не мог понять что не так - в итоге загнал на UART2 - потом выяснилось, что просто без 220 PZEM ничего не выдает... uart:   id: bus0   tx_pin: GPIO17   rx_pin: GPIO16   baud_rate: 9600  sensor:   - platform: pzem004t     uart_id: bus0     voltage:        name: "Pzem voltage"     current:        name: "Pzem current"     power:       name: "Pzem power" 

Итого

Получаем три сенсора — к сожалению, автор интеграции, по какой-то причине, не смог найти как получать параметр Energy — киловатт/часы…

ea858a.jpg

  • Цена: US$ 14.77+US$ 8.28

В первую очередь хочу поблагодарить сотрудников интернет магазина. За предоставленные образцы PZEM-004 и ESP8266 В следствии чего, у меня появилась возможность написать этот обзор и поделиться с вами тем что я узнал и сделал с этими замечательными приборами. Я не буду описывать упаковку и характеристики данных товаров. подобные обзоры уже существуют на Муске. Я попытаюсь рассказать как можно соединить эти приборы и считывать информацию с PZEM-004 на ESP8266. Данный экземпляр PZEM-004 имеет интерфейс Uart, который я и буду использовать. Первое препятствие на моем пути, стало то, что сигнальное напряжение на UART PZEM-004 5v а на ESP8266 3,3v. Можно конечно использовать модуль согласования напряжения. Но в данном случае я поступил проще и дешевле. Для того что бы UART интерфейс PZEM-004 работал на напряжении 3.3v достаточно впаять одно дополнительное сопротивление на плату PZEM-004. Делается это так: откручиваем 4 винта на задней крышке и снимаем лицевую панельb998fc.jpg Дальше вытаскиваем плату из корпуса056e99.jpg И вот таким образом припаиваем сопротивление 1ком.201404.jpg Теперь рабочее напряжение на сигнальных контактах PZEM-004 будет 3.3v. Следующие препятствие состоит в том что штатные выходы UART ESP8266 который я использую подключены к интерфейсу USB и не могут быть использованы для других целей. Да и штатный USB штука полезная и может пригодиться для логирования и управления контролером через компьютер. Но выход есть.В ESP8266 UART можно переключать на альтернативные контакты. GPIO13 и GPIO15. Но тут нас ожидает очередная засада.Дело в том что GPIO15 при включении питания контроллера должен находиться в низком уровне и на плате контроллера есть сопротивление которое подтягивает его к земле. Но при подключении этого контакта к RX контакту PZEM-004, он через светодиод оптрона оказывается подключенным к плюсу питания. Это приводит к тому, что если в момент включения питания на контроллере подключен UART интерфейс к PZEM-004, контроллер не запускается и переходит в режим прошивки. Что бы этого избежать необходимо добавить ключ на транзисторе по схеме с общим коллектором. На этом электрические заморочки закончены, и можно приступать к программированию. Так выглядит готовый модуль.91b029.jpg С подключенным дисплеем.519cda.jpg Как-то так, это все работает.b56ee9.jpg Некоторая разница в показаниях видна из за того, что существует период опроса 2 сек и соответственно задержка в выводе показаний.33a32e.jpg Минимальное напряжение при котором PZEM-004 еще работает 8e2253.jpg В данной конструкции можно использовать более дешевую модификацию без дисплеяPZEM-004t491631.jpg В этом случае дополнительный резистор для согласования напряжения UART впаивается сюда:e86098.jpg Я делаю устройство которое будет контролировать некий агрегат для нагрева жидкости. Так что я добавил в схему датчик температуры. Соединяем все детали вместе таким образом: Подключаем PZEM-004853d39.jpg Подключаем датчик температуры ds18b20 Через модуль согласования уровней подключаем дисплей. В моем случае LCD 2004Тут берем скрипты на lua и закачиваем в контролерВ этом обзоре я описывал как прошивать контроллер и закачивать скрипты Если мовый модуль PZEM-004 не будет отвечать, необходимо подать на него команду «установки адреса» Это можно сделать так; В скрипте POWER.lua найти такой кусок кода: И поправить так: Загрузить исправленный скрипт и запустить контроллер и PZEM-004. После этого исправить текст скрипта обратно как было и снова его загрузить в контроллер. После этого все должно заработать. Всем удачи, хорошего настроения и радости от сделанного своими руками. Товар предоставлен для написания обзора магазином. Обзор опубликован в соответствии с п.18 Правил сайта. Используемые источники:

  • https://habr.com/post/453472/
  • https://sprut.ai/client/article/1589
  • https://mysku.ru/blog/china-stores/43331.html

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации