С помощью модуля PZEM-004T есть возможность измерять количество потребляемой электроэнергии, но по умолчанию в прошивке ESPEasy модуль не поддерживается.
В статье речь идет о модуле PZEM-004T (v1.0)
На форуме https://www.letscontrolit.com/forum я нашел ветку по PZEM-004T, где некий aleph0 уже собрал прошивку для esp8266 с 4 Мб памяти, за что ему спасибо:
Скачать отсюда: ESPEasy-2.0.0-dev12_test_4096.bin.zip
Скачать с форума: ESPEasy-2.0.0-dev12_test_4096.bin.zip
Прошил я ее через веб интерфейс ESPEasy (Tools>Firmware>Load)
Далее подключаем PZEM-004T к esp:
5V (Vin) esp к 5V PZEM (пин 1)
GPIO-14 (D5) esp к TX PZEM (пин 3)
GPIO-12 (D6) esp к RX PZEM (пин 2)
Gnd esp к Gnd PZEM (пин 4)
Я сначала на PZEM 220В не подавал, зашел в браузере в веб интерфейс espeasy>Devices>Edit и настроил PZEM следующим образом:
Значение Delay нельзя ставить меньше 15 секунд, возможен выход из строя модуля
Значение idx это Dummy устройство pzem1, мы его создадим чуть ниже.
Сохранил, перезагрузил esp, подал 220 на PZEM и показания начали отображаться:
Теперь нам нужно передавать показания в Domoticz. Вот тут нашел инструкцию:
Создаем Dummy устройства со следующими значениями:
Создаем переменную pzem1_idx с типом Целое и значением 0:
Создаем Lua скрипт с параметром Device в Настройка>Дополнительно>События:
Вставляем туда следующий код:
--[[Script to read infos from espeasy/pzem-004t and disptach it in correct devices ]]-- -- Edit the dummies name below to match yours local dev_HC ="Elec happy hours" local dev_pzem1 ="pzem1" local dev_V1 ="Вольт" local dev_A1 ="Ампер" local dev_W1 ="Ватт" -- End of user-edit part function UpdateVar(variable,valeur) --Update une variable Domoticz commandArray[#commandArray+1] = {['Variable:'..variable] = tostring(valeur)} end function UpdateDev(device,nvalue,svalues) --Met à jour un device numérique Domoticz commandArray[#commandArray+1] = {['UpdateDevice'] = otherdevices_idx[device]..'|'..tostring(nvalue)..'|'..tostring(svalues)} end function pzem_read(pzem,HC,dev_V,dev_A,dev_W) --[[Read values from a 3ph-amp dummies and dispatch them in sensor for voltage, current, and power Input : pzem : type 3ph amp, updated by espeasy HC : switch "On"=happy hours for electricity Output : dev_V : type voltage dev_A : type current dev_W : P1 smart counter ]]-- local u1, u2, p1, p2 local val_V,val_A,val_W,val_Wh local local_dbg=0 old_Wh=uservariables[pzem.."_idx"] u1, u2, p1, p2 = string.match(otherdevices_svalues[dev_W],"(.-);(.-);(.-);(.-);.*") -- Usefull for newly created counters u1=u1 or 0 u2=u2 or 0 p1=p1 or 0 p2=p2 or 0 val_V,val_A,val_W,val_Wh=string.match(otherdevices_svalues[pzem],"(.-);(.-);(%d*);(%d*)") if local_dbg==1 then print(otherdevices_svalues[pzem]) print(val_V) print(val_A) print(val_W) print(val_Wh) end if tonumber(val_V)>1 then UpdateDev(dev_V,0,val_V) end if tonumber(val_A)<101 then UpdateDev(dev_A,0,val_A) end if tonumber(val_Wh)>=tonumber(old_Wh) then if otherdevices[HC] == 'Off' then -- svalue=USAGE1;USAGE2;RETURN1;RETURN2;CONS;PROD UpdateDev(dev_W,0,tostring(u1+val_Wh-old_Wh)..';'..tostring(u2)..';0;0;'..tostring(val_W)..';0') else UpdateDev(dev_W,0,tostring(u1)..';'..tostring(u2+val_Wh-old_Wh)..';0;0;'..tostring(val_W)..';0') end UpdateVar(pzem.."_idx",val_Wh) end end commandArray = {} if devicechanged[dev_pzem1] then pzem_read(dev_pzem1,dev_HC,dev_V1,dev_A1,dev_W1) end return commandArray
У автора скрипта на 59 строке значение if tonumber(val_A)>1. У меня с ним не обновлялось значение Ампер, я изменил на <101 и все работает (в коде выше уже все исправлено)
Так же можно поменять названия Dummy устройств на свои. В таком случае в этой части кода их тоже нужно заменить на свои:
local dev_HC ="Elec happy hours" local dev_pzem1 ="pzem1" local dev_V1 ="Вольт" local dev_A1 ="Ампер" local dev_W1 ="Ватт"
Вот и все, теперь расход электроэнергии и ее параметры мы тоже контролируем)
P.S:
Более простой способ отправки показаний через MQTT:
Здравствуйте! Большое спасибо за вашу статью по теме Domoticz+PZEM004 на русском языке. Я выполнил схему на той же элементной базе что и у вас ESP8266 NODEMCU LOLIN v.3 + PZEM 004t V1.0 Только прошивку ESPEasy-2.0.0-dev12_test_4096.bin.zip сделал через программу nodemcu-flasher-master. Все настраивается (WiFi-соединение, подключение к Domoticz, добавляется девайс «Voltage & Current (AC) PZEM-004T [Testing]») Но хоть как я не старался получить показания со счетчика PZEM мне не удается в веб-интерфейсе ESP Easy. Показывает напряжение, ток и мощность «-1» а Energy «0» Я уже и провода на разъеме TX-RX местами менял, и на другие GPIO0 и GPIO2 подключал, и внешний БП +5V… Подробнее »
Здравствуйте! У меня -1 значения были, когда через pzem не проходит 220. То есть если не подавать электричество, то будут значения -1 (на той прошивке, что я собрал самостоятельно, уже были нули)
Та-же проблема. -1 по всем показателям. Что делать уже не знаю. Подключал и напрямую и через конвертер уровней. Попробую конвертер проверить на днях. Если он работает, то даже не знаю куда и думать.
—————
P.S.: Урааааааааааааа!!! Заработало! Просто поменял местами Rx и Tx на PZEM.
Спасибо!
Приветствую Вас. После прошивки esp попадаю на страницу установки esp easy, после попытки перейти на закладку девайс, вообщем после любой попытки что-то изменить отваливаюсь от от еспишки, хотя она висит в сети и пингуется, попытка подключиться к ней не дает ни какого эффекта. Вчем может быть дело
Для начала попробуйте заново ее перепрошить. И, как вариант, попробовать проверить блок питания, может не тянет pzem — потестируйте еспшку без pzem. Или попробуйте другую есп
Добрый день! Подскажите у вас не потребовалось добавление резистора 1кОм в паралель R17 на PZEM для согласования с ESP?
Добрый день! Тоже об этом читал, но все работало и без резистора
Добрый день!
Подскажите, в логах Domoticz появляется сообщение:
EventSystem: in pzem1: [string «—[[Script to read infos from espeasy/pzem-00…»]:58: attempt to compare number with nil
58 строка кода: if tonumber(val_V)>1 then UpdateDev(dev_V,0,val_V) end
Как это можно исправить?
Подскажите как зайти в веб интерфейс ESP . Требует пароль.
стандартный пароль — configesp
Очень сложно, и слишком умно.
В итоге, с того же форума лучше работает и гораздо проще отправка данных через рулезы.
Создаем устройства, смотрим их idx, а дальше в рулезах espeasy рисуем следующее:
on PZEM#Current do
SendToHTTP 192.168.1.15,8080,/json.htm?type=command¶m=udevice&idx=79&nvalue=0&svalue=[PZEM#Volt]
SendToHTTP 192.168.1.15,8080,/json.htm?type=command¶m=udevice&idx=80&nvalue=0&svalue=[PZEM#Current]
SendToHTTP 192.168.1.15,8080,/json.htm?type=command¶m=udevice&idx=82&nvalue=0&svalue=[PZEM#Power]
SendToHTTP 192.168.1.15,8080,/json.htm?type=command¶m=udevice&idx=83&nvalue=0&svalue=[PZEM#Energy]
endon
В итоге получаем без всяких скриптов и непонятных настроек все данные в системе.
Вы правы) только я об этом уже писал: https://kvvhost.ru/2018/05/14/data-pzem-004t-to-domoticz/ 🙂
Аааа… чукча не читатель, чукча писатель 🙂 Не увидел той статьи. А вот скрипт для чего стоит написать — так это для отсчета ежемесячного потребления электричества. Например 1 числа каждого месяца берем показания общей потребленной энергии и вычитаем прошлые показания. Думаю такой параметр в нашем полоумном доме было бы более функционально. Вчера как раз таки допилил этот показометр, и пришел к выводу, что кроме как инфомрационно нагрузки наш PZEM не несет. Ибо считывать с него параметры нельзя перманентно, а только раз в 15 секунд, а так бы можно было бы на его основе сделать некое подобие защиты от перенапряжения (увидели,… Подробнее »
Добрый день! Спасибо за хорошую статью! Подскажите, возможно ли подключение 3х устройств PZEM004T к одной плате nodemcu v3 на ESPEasy для считывания показаний с трехфазного счетчика?
Спасибо! Насчет подключения нескольких pzem — я лично сомневаюсь. Читал в интернете про коммерческий продукт на базе Nodemcu и pzem-004t (как бы странно это не звучало) и у них для 3х фаз было 3 nodemcu и 3 pzem
Вот такое видел в сети, но не пробовал:
dodther
Подключаем датчики сначала по отдельности и каждому присваиваем свой адрес( адрес зашивается в PZEM и при выключении питания не меняется). потом все 3 паралелим и сажаем на один сериал( на двух PZEM надо будет удалить R15). В коде создаём всего один объект PZEM (пример PZEM004T pzem(4,5);) Ну и дальше дёргаем данные по адресу. Например «pzem.power(ip1)» возмёт данные с одного датчика, а «pzem.power(ip2)» уже с другого. Я делал тоже на блинке, только микроконтроллер не ESP, а ардуино. Можешь глянуть проект тут github.com/dodther/Energomonitor
Спасибо за инфу, было бы 3 pzem можно было бы проверить