Задался я вопросом — куда девается ток из проводов? Вроде топим дом газом, в доме все лампы диодные, посудомойку включаем в ночь, бани с электропечкой пока нет, а электричество все время куда-то девается. Непорядок. Надо бы за ним проследить. Добро пожаловать под кат…
Первый шаг — общий мониторинг потребления
Задачи
Я решил затеять охоту на стадо зайцев. Зайцами были выбраны:
- Мониторинг электросети через интернет. Моментальный контроль параметров сети у меня присутствует — в коридоре, в щитке есть энергомонитор 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 преобразователей, пока не перевернул БП и не прочитал на нем надписи).
Прошивка
Посмотрел имеющиеся в сети. Как обычно не нашел подходящей и решил написать свою. За базу взял свой же проект для реле 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 считает максимум 9999кВт*ч, потом сбрасывается — реализовал учет переполнений. Реализовал двухтарифный счет. Так же реализовал учет средних значений параметров — показания считываются примерно раз в 2сек, а на Народный мониториг надо передавать данные раз в 5мин, естественно средние. Добавил в систему работу с массивом датчиков DS18B20. Данные считываются поочередно с периодом 2сек на датчик. Т.е. ищем датчик, нашли — получаем данные, через 2сек ищем следующий и т.д. Кончились датчики — начинаем с начала. Т.е. при использовании только одного датчика период его опроса 4сек. Для этих датчиков так же сделан расчет средних значений. Актуальные данные энергомонитора можно получить по HTTP: Все данные хранятся в целых числах, когда нужно (например при передаче в Народный мониториг) — в нужную позицию добавляется точка. Реализовал публикацию данных по протоколу 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 у меня стояло как отдельный сервер в виртуалке, а подходящий для решения проблемы ключ вводился в настройки для модуля к Ассистенту, так что — ставим как модуль.
Кто не в курсе:
- Переходим в Hass.io
- Addon store
- Добавить репозиторий https://github.com/esphome/hassio
- В нем — установить модуль EspHome
- Перед запуском — добавляем в конфиг строку «esphome_version»: «pzem004t»
- Сохраняем конфиг и запускаем EspHome. Или перезапускаем…
- Ждем некоторое время — он подкачивает файлы и стартует не особо быстро.
- Открываем 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 — киловатт/часы…
- Цена: 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 винта на задней крышке и снимаем лицевую панель Дальше вытаскиваем плату из корпуса И вот таким образом припаиваем сопротивление 1ком. Теперь рабочее напряжение на сигнальных контактах PZEM-004 будет 3.3v. Следующие препятствие состоит в том что штатные выходы UART ESP8266 который я использую подключены к интерфейсу USB и не могут быть использованы для других целей. Да и штатный USB штука полезная и может пригодиться для логирования и управления контролером через компьютер. Но выход есть.В ESP8266 UART можно переключать на альтернативные контакты. GPIO13 и GPIO15. Но тут нас ожидает очередная засада.Дело в том что GPIO15 при включении питания контроллера должен находиться в низком уровне и на плате контроллера есть сопротивление которое подтягивает его к земле. Но при подключении этого контакта к RX контакту PZEM-004, он через светодиод оптрона оказывается подключенным к плюсу питания. Это приводит к тому, что если в момент включения питания на контроллере подключен UART интерфейс к PZEM-004, контроллер не запускается и переходит в режим прошивки. Что бы этого избежать необходимо добавить ключ на транзисторе по схеме с общим коллектором. На этом электрические заморочки закончены, и можно приступать к программированию. Так выглядит готовый модуль. С подключенным дисплеем. Как-то так, это все работает. Некоторая разница в показаниях видна из за того, что существует период опроса 2 сек и соответственно задержка в выводе показаний. Минимальное напряжение при котором PZEM-004 еще работает В данной конструкции можно использовать более дешевую модификацию без дисплеяPZEM-004t В этом случае дополнительный резистор для согласования напряжения UART впаивается сюда: Я делаю устройство которое будет контролировать некий агрегат для нагрева жидкости. Так что я добавил в схему датчик температуры. Соединяем все детали вместе таким образом: Подключаем PZEM-004 Подключаем датчик температуры 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