Велосипед из энергомонитора PZEM004T и ESP8266, с Народным мониторингом
Свой неудавшийся проект контроллера температуры (Фиаско. История одной самоделки IoT) я решил оставить в качестве только монитора. И следующим шагом прикрутил энергомонитор PZEM004T, за одно реализовал отправку данных на Народный мониториг.
Добро пожаловать под кат…
Задался я вопросом — куда девается ток из проводов? Вроде топим дом газом, в доме все лампы диодные, посудомойку включаем в ночь, бани с электропечкой пока нет, а электричество все время куда-то девается. Непорядок. Надо бы за ним проследить.
Первый шаг — общий мониторинг потребления
Задачи
Я решил затеять охоту на стадо зайцев. Зайцами были выбраны:
- Мониторинга электросети через интернет. Моментальный контроль параметров сети у меня присутствует — в коридоре, в щитке есть энергомонитор PZEM061, на экране можно увидеть напряжение, ток и мощность. А вот на месте отображения потребляемой энергии — какая-то абстракция, слишком мало разрядов. Но в коридоре не удобно. Хочу на экране телефона.
- График потребления электричества. Хотелось бы узнать когда же возникает чрезмерное потребление?
- Показания счетчика через интернет. Это боль — передача показаний счетчика в энергосбыт. Передавать им показания надо с 15 по 25 число месяца. Я об этом часто забываю и они начинают звонить роботом и писать спамом. При этом когда они о себе напоминают — я как правило на работе, а счетчик у меня на столбе на улице. Хочу на экране телефона.
- Мониторинг температуры стабилизатора. В нашей деревне зимой больше 200в на входе в дом не бывает, доходит до 140в. Поэтому у меня на есть стабилизатор на 12кВт, но при таких параметрах и длительной нагрузке от 2кВт и с учетом расположения стабилизатора в нише стены — стабилизатор перегревается и отключается, пришлось добавить пару вентиляторов (с ними температура остается в допустимых пределах) — ранее они были включены постоянно, сейчас под замес — поставил термостаты KSD9700 на 65 гр, ждем зимы. Следить за этим параметром я не хочу, т.к. влиять на него не могу. Но после добавления термостатов — надо проконтролировать результат.
Железо
Для решения поставленных задач было выбрано:
- PZEM004T — энергомонитор с UART. Позволяет получать параметры электросети — один параметр раз в 0.6сек: напряжение, ток, мощность, потребленную энергию, а так же не нужные мне частоту и коэффициент мощности. Используется с измерительным трансформатором 1:1000. Чтобы модуль понимал логику 3.3в, на резистор R17 1кОм напаял сверху еще один такой же, уменьшив сопротивление до 0.5кОм (или можно было заменить R17 на 470Ом).
- ESP8266 NodeMCU — универсальный микроконтроллер с WiFi, по размеру хорошо сочетается с PZEM004T — можно соединить стойками с использованием имеющихся отверстий на платах. Так же на плате NodeMCU есть полезная кнопка Flash (соединена с GPIO0) — ее удобно использовать для управления режимом работы — например для включения SoftAP.
С учетом того, что девайс будет размещен в металлическом корпусе стабилизатора — припаял на ESP внешнюю антенну. Пытался запитать ESP от PZEM004T (подпаяв провода к круглому конденсатору — на нем примерно 7в) — не получилось, при подключении ESP напряжение просаживается до 2в. Но в стабилизаторе уже есть БП на 5в — для вентиляторов, значит он и будет использован (я думал он на 12в, поэтому долго мучился, чтоб подключить к нему ESP — не работало ни в какую, перепробовал кучу DC-DC преобразователей, пока не перевернул БП и не прочитал на нем надписи).
Прошивка
Посмотрел имеющиеся в сети. Как обычно не нашел подходящей и решил написать свою.
За базу взял свой же проект для реле Sonoff (простейший функционал, по HTTP и по кнопке включается и выключается, больше ничего не умеет; используется совместно с MacroDroid для щадящего питания телефона c постоянно включенным экраном — у предыдущего от постоянного заряда аккумулятор вздулся и выдавил экран). Но кроме функционала реле, сборка имеет http сервер, настройки WiFi, NTP, работает с кнопкой GPIO0 — разные действия от длительности нажатия, моргает по-всякому лампочкой (например отсчет секунд нажатия кнопки, отражение состояния реле и WiFi)…
Естественно несколько доработал настройки:
Посмотрел имеющуюся библиотеку для работы с 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 считает максимум 99кВт*ч, потом сбрасывается — реализовал учет переполнений. Реализовал двухтарифный счет. Так же реализовал учет средних значений параметров — показания считываются примерно раз в 2сек, а на Народный мониториг надо передавать данные раз в 5 мин, естественно средние.
Добавил в систему работу с массивом датчиков DS18B20. Данные считываются поочередно с периодом 2сек на датчик. Т.е. ищем датчик, нашли — получаем данные, через 2сек ищем следующий и т.д. Кончились датчики — начинаем с начала. Т.е. при использовании только одного датчика период его опроса 4сек. Для этих датчиков так же сделан расчет средних значений.
Актуальные данные энергомонитора можно получить по HTTP:
Все данные хранятся в целых числах, когда нужно (например при передаче в Народный мониториг) — в нужную позицию добавляется точка.
Реализовал публикацию данных по протоколу MQTT/UDP. Добавил поддержку этого протокола и датчика PZEM004T в свой монитор:
Реализовал публикацию данных на Народном мониторинге:
Естественно, добавил настройки публикации данных:
Итоги
В результате мониторинга в реальном времени уже отключил один из двух постоянно включенных миникомпьютеров, настроил на компьютере дитеныша гибернацию, в BD плеере (используется только для караоке) перенастроил режим сна.
Когда наберется статистика для графиков — буду дальнейшие шаги предпринимать.
Кто захочет заиметь себе такой энергомонитор — велкам в личку за прошивкой (Халява, сэр!).
P.S.
При разработке девайса столкнулся с мистикой — при питании ESP от USB компа, от любой зарядки телефона — все работает. При питании от встраиваемого БП — не работает. Привлек для расследования логический анализатор и симплескоп — питание от синего блока вроде в порядке, сигналы от ESP идут корректные, а обратно — тишина. Другой блок питания — все отлично работает.
Методом научного тыка осознал, что когда я использую встраиваемый БП — я подключаю его к питанию PZEM004T, то есть в этом случае два устройства стартуют одновременно (с другими БП одновременное включение не возможно). А я для коммуникации использую аппаратный UART, на который ESP при старте выкидывает кучу мусора. PZEM004T не может это переварить при старте и зависает. Если же PZEM004T уже включен — старт ESP и мусор в порту он переживает без проблем.
Решением стало использование SoftwareSerial, с ним все работает отлично.