Учет электроэнергии в Domoticz модулем PZEM-004T на прошивке ESPEasy

С помощью модуля 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:

Еще один способ получения данных от PZEM-004T в Domoticz

Поделитесь с друзьями
Подписаться
Уведомить о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

17 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Санек
Санек
5 лет назад

Здравствуйте! Большое спасибо за вашу статью по теме 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… Подробнее »

Вован Сидорович
Вован Сидорович
5 лет назад
Ответить на  Санек

Та-же проблема. -1 по всем показателям. Что делать уже не знаю. Подключал и напрямую и через конвертер уровней. Попробую конвертер проверить на днях. Если он работает, то даже не знаю куда и думать.
—————
P.S.: Урааааааааааааа!!! Заработало! Просто поменял местами Rx и Tx на PZEM.
Спасибо!

Андрей
Андрей
5 лет назад

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

Константин
Константин
5 лет назад

Добрый день! Подскажите у вас не потребовалось добавление резистора 1кОм в паралель R17 на PZEM для согласования с ESP?

Алексей
Алексей
5 лет назад

Добрый день!
Подскажите, в логах 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

Как это можно исправить?

Александр
Александр
5 лет назад
Ответить на  Алексей

Подскажите как зайти в веб интерфейс ESP . Требует пароль.

Макс
Макс
5 лет назад

Очень сложно, и слишком умно.
В итоге, с того же форума лучше работает и гораздо проще отправка данных через рулезы.
Создаем устройства, смотрим их idx, а дальше в рулезах espeasy рисуем следующее:

on PZEM#Current do
SendToHTTP 192.168.1.15,8080,/json.htm?type=command&param=udevice&idx=79&nvalue=0&svalue=[PZEM#Volt]
SendToHTTP 192.168.1.15,8080,/json.htm?type=command&param=udevice&idx=80&nvalue=0&svalue=[PZEM#Current]
SendToHTTP 192.168.1.15,8080,/json.htm?type=command&param=udevice&idx=82&nvalue=0&svalue=[PZEM#Power]
SendToHTTP 192.168.1.15,8080,/json.htm?type=command&param=udevice&idx=83&nvalue=0&svalue=[PZEM#Energy]
endon

В итоге получаем без всяких скриптов и непонятных настроек все данные в системе.

Максим
Максим
5 лет назад
Ответить на  kvv

Аааа… чукча не читатель, чукча писатель 🙂 Не увидел той статьи. А вот скрипт для чего стоит написать — так это для отсчета ежемесячного потребления электричества. Например 1 числа каждого месяца берем показания общей потребленной энергии и вычитаем прошлые показания. Думаю такой параметр в нашем полоумном доме было бы более функционально. Вчера как раз таки допилил этот показометр, и пришел к выводу, что кроме как инфомрационно нагрузки наш PZEM не несет. Ибо считывать с него параметры нельзя перманентно, а только раз в 15 секунд, а так бы можно было бы на его основе сделать некое подобие защиты от перенапряжения (увидели,… Подробнее »

gumilev
5 лет назад

Добрый день! Спасибо за хорошую статью! Подскажите, возможно ли подключение 3х устройств PZEM004T к одной плате nodemcu v3 на ESPEasy для считывания показаний с трехфазного счетчика?

gumilev
5 лет назад
Ответить на  kvv

Вот такое видел в сети, но не пробовал:
dodther
Подключаем датчики сначала по отдельности и каждому присваиваем свой адрес( адрес зашивается в PZEM и при выключении питания не меняется). потом все 3 паралелим и сажаем на один сериал( на двух PZEM надо будет удалить R15). В коде создаём всего один объект PZEM (пример PZEM004T pzem(4,5);) Ну и дальше дёргаем данные по адресу. Например «pzem.power(ip1)» возмёт данные с одного датчика, а «pzem.power(ip2)» уже с другого. Я делал тоже на блинке, только микроконтроллер не ESP, а ардуино. Можешь глянуть проект тут github.com/dodther/Energomonitor