Medição de Energia com PZEM + ESP com Tasmota

tasimage

Para quem quiser configurar um medidor de Energia PZEM-004T usando Tasmota com uma placa ESP8266 (NodeMcu) sem ter a necessidade de soldar, de uma forma simples e prática, siga este tutorial.

Do que você irá precisar?

  • Módulo PZEM004T (100A) - (Neste tutorial foi utilizado a V3)
  • NodeMcu v3 (e um cabo microUSB → USB para conectar no PC)
  • Jumpers (femea/femea10CM ou maior caso seja sua necessidade)
  • Download do ESPHome-Flasher e do arquivo .bin do Tasmota.

O módulo PZEM004T (100A) - V3


Com esse módulo é possível realizar todas medições citadas abaixo. Além disso, estão disponíveis algumas funções para estabelecermos alarmes de consumo e totalizadores.
Com o PZEM é possível medir até 100 Amperes, ou seja se você deseja medir o consumo total da sua residência, pode por exemplo colocar a bobina do PZEM no fio da fase do disjuntor geral. Se sua rede de energia elétrica for Bifásica você precisará de 2 PZEM’s e se for Trifásica você precisará de 3 PZEM’s.

Vejamos algumas medidas realizadas e suas especificações:

  • Potência: 0 ~ 22 kW
  • Energia: 0 ~ 9999 kWh
  • Tensão: 80 ~ 260 VAC
  • Corrente: 0 ~ 100 A

:rotating_light: ATENÇÃO :rotating_light:
Não mexa na sua rede elétrica sem conhecimento, contrate um profissional, a não ser que você seja um. É altamente perigoso se você não tem conhecimento necessário.

A ligação

Resumindo a ligação ficará assim:

  • TX (pzem) no D2 (GPIO4)
  • RX (pzem) no D1 (GPIO5)
  • 5v (pzem) no VU (Pode ser utilizado o VIN também)
  • GND (pzem) no GND ou G (pode ser qualquer um)

NodeMcu Esp8266 Módulo Wifi

No Mercado Livre você encontra por aproximadamente R$ 20,00 + R$ 10,00 de frete. Dependendo da quantidade você pode até ganhar frete grátis.

Pode ser tanto o modelo Amica quanto o LoLin. Neste tutorial vamos usar o LoLin, mas não muda nada em relação a configuração com o modelo o Amica.

Você precisará de um cabo microUSB → USB para conectar seu ESP em seu computador e aplicar o firmware Tasmota.

Após conectar você deve usar o ESPHome-Flasher ou alguma outra ferramenta para aplicar o flash Tasmota em seu ESP.

Baixe o arquivo binário do Tasmota mais recente.

Eu utilizei o tasmota.bin v7.1.2 neste exemplo.

Agora basta aplicar o flash no seu ESP. Execute o ESPHome-Flasher, selecione a porta em que seu ESP está conectado (se não tem certeza, teste tirando e colocando novamente para verificar qual porta estará disponível) e em seguida pressione o botão Flash ESP.

O resultado deve ser algo semelhante a imagem abaixo, do contrário algo não funcionou como deveria.

Além disso, deve aparecer uma nova rede wifi (SSID) chamado tasmota-xxxx.
image

Conecte nesta rede, e logo em seguida você será redirecionado para a página de configuração do tasmota para conectar seu dispositivo na sua rede.

Preencha os dados do SSID (sua wifi) e Password (sua senha da sua rede wifi). Após isso clique em save, e em seguida irá reiniciar. Após reiniciar seu ESP, ele já estará conectado em sua rede, e com isso irá herdar um IP. Você pode verificar o novo IP e se necessário (recomendo) aplicar a reserva de IP via DHCP para seu dispositivo ter sempre o mesmo IP.

Com isso você conseguirá acessar via IP o seu ESP com tasmota através do seu navegador (Chrome, Firefox etc) e configurar as informações em seu dispositivo para conectar via MQTT por exemplo.

Se você não sabe configurar o tasmota, sugiro visualizar o seguinte artigo:

Coso contrário, você verá algo como na imagem abaixo:

Mais abaixo você pode aplicar o template que disponibilizo, que já ficará pronto com as configurações necessárias para poder medir a energia junto com o pzem.

  1. Acesse o menu Configure Other
    image

  2. E cole o template (código abaixo) no campo template
    image

  3. Template (código) para você copiar e aplicar:

{“NAME”:“PZEM-004”,“GPIO”:[255,255,255,255,98,62,255,255,255,255,255,255,255],“FLAG”:15,“BASE”:18}

Exemplo:

Após aplicar, você acabou de criar um novo template/módulo. Basta acessar o menu Configure Module e selecionar o novo módulo criado (Neste caso coloquei o nome de PZEM-004)

Conectando o PZEM com ESP

Jumpers

No MercadoLivre você encontra entre R$ 10,00 e R$ 30,00 dependendo da quantidade e tamanho.

PZEM

No PZEM você deve conectar a bobina caso ainda não esteja conectada, e consequentemente os jumpers.

ESP

Agora desconecte seu ESP do seu PC e conecte os jumpers no seu ESP, criando a ligação do PZEM + ESP.

Exemplo de como ficou a minha conexão

Agora é preciso alimentar o PZEM e o ESP para que ambos tenham energia.
Eu apenas peguei uma tomada, dois pedaçoes de fio e liguei no PZEM, e para o ESP peguei um cabo microUSB com uma tomada.

Resultado final

Após ligar na energia, deve ao menos mostrar a voltagem e a frequência.

Caso contrário, você pode ter invertido o RX com o TX. Você pode testar acessando o menu Configure Template e mudar o GPIO4 com o GPIO5.

Se ainda não funcionar, revise o tutorial e verifique se não esqueceu de nada. Verifique os jumpers não desconectaram, tente usar o VIm ao invés o UV para ligar no PZEM 5V.

Para um teste final, você deve pode pegar uma espécie de extensão, passar o fase dentro da bobina, e ligar algo na extensão como um secador.

Após concluir o projeto, coloquei em uma caixinha de impressora 3D.


A caixinha eu comprei com o o Ramon do canal no Youtube Alguma Coisa na Tecnologia. Muito bom por sinal.

Fiz isso para colocar na caixa de disjuntor extra que solicitei para construtora realizar no meu apartamento.

Espero que possa ter ajudado.

Home Assistant

Para configurar no Home Assistant, eu simplesmente habilitei o comando SetOption19 1 no console do dispositivo com tasmota.

Você também pode configurar de forma manual, e para isso sugiro acessar o site oficial do tasmota que explica como fazer isso.

Dica

Verifique a hora no console, caso esteja incorreta você pode corrigir de forma manual com o seguinte comando.

time hh mm ss

Substitua o HH pela hora atual, o mm pelos minutos atuais e o ss pelos segundos atuais. Exemplo: time 18 50 45 caso seja 18:50:45.

15 curtidas

Excelente, @douglas!!

Bom dia,

Muito bom o tutorial.

Alguém pode me orientar de como fazer para enviar os dados lidos do pzem para um banco de dados mysql a cada 30 segundos.

Agradeço,

2 curtidas

Você precisa configurar o Recorder

Todos os detalhes encontram-se nesta página de como configurar para o tipo de BD que você deseja,

Neste tutorial abaixo, eu explico como configurar o Maria DB

4 curtidas

Boa tarde Douglas,

Obrigado pelo retorno. Ativei o banco de dados MariaDB, funcionou beleza. Minha dúvida agora é como pegar uma informação do pzem e colocar no banco. Outra coisa este banco é interno do HA, como faço para conectar em um banco mysql por exemplo que esteja em um provedor?

Agradeço,

1 curtida

As informações do PZEM são sensores no HA. Os seus sensores já estão indo para o BD.

Também é possível colocar em BD em outro servidor, deve ser algo assim:

  db_url: mysql://*****:****@192.168.178.91:3306/ha?charset=utf8

Eu não sei exatamente, mas você pode consultar a página https://www.home-assistant.io/integrations/recorder#mariadb-and-mysql para mais detalhes.

2 curtidas

Douglas, posso usar 3 Pzem no mesmo NodeMCU?
Poderia me orientar caso seja possível os 3 no mesmo Node, tenho que usar dois pinos para cada Pzem (como foi feito o D1 e D2 no tutoriral)?

7 curtidas

Também tenho essa dúvida. Caso não seja possível, eu conseguiria isso com algum outra placa?

3 curtidas

Olá,
acabei de comprar um PZEM-004T, chegou hoje e a noite vou testar ele.

Pretendo usar ele no quadro geral de luz da minha casa, e como tenho trifásico, pretendo adicionar mais dois sensores para monitorar as 3 fases.

Pelo que pesquisei, é possível fazer isto com o ESPHome…


Assim que conseguir fazer meus testes posso postar aqui os resultados!

Bom dia,
fiz alguns testes ontem a noite e acredito que irá funcionar corretamente com o ESPHome o monitoramento de 3 fazes com 3 PZEM ligados juntos…
Acabei de encomendar mas 2 para fazer o monitoramento…
Mas configurando como se fossem 3, ele exibiu os dados corretamente do que estava conectado…

Segue como configurei no esphome:

substitutions:
  hostname: 'esp32_PZEM'
  
esphome:
  name: $hostname
  platform: ESP32
  board: esp32doit-devkit-v1
  
  
wifi:
  ssid: "nomerede"
  password: "senha"
    
api:
ota:
logger:

web_server:
  port: 80

binary_sensor:
  - platform: status
    name: ${hostname} status

switch:
  - platform: restart
    name: ${hostname} Restart
    id: restart_switch

text_sensor:
  - platform: wifi_info
    ip_address:
      name: ${hostname} IP
    ssid:
      name: ${hostname} SSID
      
uart:
  tx_pin: GPIO23
  rx_pin: GPIO22
  baud_rate: 9600
  stop_bits: 2

sensor:
  - platform: wifi_signal
    name: ${hostname} wifi-sinal
    update_interval: 30s
    
  - platform: pzemac
    current:
      name: "Fase 1 Current"
    voltage:
      name: "Fase 1 Voltage"
    power:
      name: "Fase 1 Power"
    frequency:
      name: "Fase 1 Frequency"
    power_factor:
      name: "Fase 1 Power Factor"
    update_interval: 5s    
    address: 1
    
  - platform: pzemac
    current:
      name: "Fase 2 Current"
    voltage:
      name: "Fase 2 Voltage"
    power:
      name: "Fase 2 Power"
    frequency:
      name: "Fase 2 Frequency"
    power_factor:
      name: "Fase 2 Power Factor"
    update_interval: 5s    
    address: 2
    
  - platform: pzemac
    current:
      name: "Fase 3 Current"
    voltage:
      name: "Fase 3 Voltage"
    power:
      name: "Fase 3 Power"
    frequency:
      name: "Fase 3 Frequency"
    power_factor:
      name: "Fase 3 Power Factor"
    update_interval: 5s    
    address: 3
7 curtidas

Toda vez q o meu pzem reiniciar ou desligar, qd estiver up, eu preciso colocar o “setOption19 1” ou isso já fica gravado no tasmota? To perguntando pq toda vez q eu desligo o pzem e ligo ele não começa enviar os dados… Preciso fazer alguma configuração extra?

Como vc ligou os pzem juntos?

Usei as informações postadas aqui e acabei conseguindo adicionar um segundo Pzem004t v3. Assim consegui ter 2 funcionando em paralelo no mesmo Gpio. Me parece que é possível ter 3 em um mesmo esp8266.
Como fiz:
Usando o tasmota configurado, conectei SOMENTE UM PZEM ao esp8266 e configurei conforme explicado aqui.
Cada Pzem vem de fábrica com o id 1 como padrão(default). Então, se vc ligar 2 ou mais na mesma porta não funcionarão, por terem mesmo id (1).

Como trocar o id:
Com um pzem conectado, no tasmota console, Execute o comando: ModuleAddress x (onde x é o id numérico que vc quer atribuir a ele).
Eu usei o comando ModuleAddress 2, assim pude ter um pzem com id 1 (já veio assim de fábrica)!
e o outro com id 2.

Depois basta ligar os 2 pzem em paralelo na mesma porta que vc ligou somente um e eles vão funcionar!

Acabei depois voltando pro esphome, pois gostei mais de utilizar esphome.
Espero poder ter ajudado.
Abaixo segue o perfil esphome e os sensores que criei no HA, pra somar as fases e obter potencia das duas juntas e alguns calculos de custo e etc.

substitutions:
  hostname: 'esphome_pzem'
  
esphome:
  name: $hostname
  platform: ESP8266
  board: d1_mini
  
  
wifi:
  ssid: "virus.exe"
  password: "senhadarede

  manual_ip:
    static_ip: 192.168.1.36
    gateway: 192.168.1.1
    subnet: 255.255.255.0
  
    # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "esphome pzems Fallback Hotspot"
    password: "senhadarede"

#captive_portal:

api:
ota:
logger:
  baud_rate: 0

web_server:
  port: 80

binary_sensor:
  - platform: status
    name: ${hostname} status

switch:
  - platform: restart
    name: ${hostname} Restart
    id: restart_switch

text_sensor:
  - platform: wifi_info
    ip_address:
      name: ${hostname} IP
    ssid:
      name: ${hostname} SSID
      
uart:
  tx_pin: TX #GPIO1
  rx_pin: RX #GPIO3
  baud_rate: 9600
  stop_bits: 1
  
sensor:
  - platform: wifi_signal
    name: ${hostname} wifi-sinal
    update_interval: 10s
    
  - platform: pzemac
    current:
      name: "Fase 1 Current"
    voltage:
      name: "Fase 1 Voltage"
    power:
      name: "Fase 1 Power"
#      id: power1
    frequency:
      name: "Fase 1 Frequency"
    power_factor:
      name: "Fase 1 Power Factor"
    update_interval: 2s    
    address: 1
    
  - platform: pzemac
    current:
      name: "Fase 2 Current"
    voltage:
      name: "Fase 2 Voltage"
    power:
      name: "Fase 2 Power"
#      id: power2
    frequency:
      name: "Fase 2 Frequency"
    power_factor:
      name: "Fase 2 Power Factor"
    update_interval: 2s    
    address: 2

Configuration.yaml

- platform: template
    sensors:
      fase1e2juntas:
        friendly_name: Fase 1 e 2 juntas
        unit_of_measurement: "W"
        value_template: "{{ (states('sensor.fase_1_power')|float  + states('sensor.fase_2_power')|float)|round(2) }}"
      custo_mensal_energia:
        friendly_name: "Custo Mensal Energia"
        unit_of_measurement: 'R$'
        icon_template: mdi:currency-brl
        value_template: "{{ ((states.sensor.energia_mensal_normal.state | float) * (states.input_number.preco_kwh_energia.state | float)) | round(2) }}"
      custo_diario_energia:
        friendly_name: "Custo Diario Energia"
        unit_of_measurement: 'R$'
        icon_template: mdi:currency-brl
        value_template: "{{ ((states.sensor.energia_diaria_normal.state | float) * (states.input_number.preco_kwh_energia.state | float)) | round(2) }}"


  - platform: integration
    source: sensor.fase1e2juntas
    name: energia_kwh_casa
    unit_prefix: k
    round: 2

utility_meter:
  energia_diaria:
    source: sensor.energia_kwh_casa
    cycle: daily
    tariffs:
      - normal
  energia_mensal:
    source: sensor.energia_kwh_casa
    cycle: monthly
    tariffs:
      - normal
  custo_diario_energia_utility:
    source: sensor.custo_diario_energia
    cycle: daily
    tariffs:
      - normal
  custo_mensal_energia_utility:
    source: sensor.custo_mensal_energia
    cycle: monthly
    tariffs:
      - normal
5 curtidas

Bom dia Bruno, tudo bem? parabéns pelo projeto!

Estou tentando integrar o seu projeto aqui, porém tenho somente uma fase, estou com o seguinte erro:

Invalid config for [sensor.integration]: [utility_meter] is an invalid option for [sensor.integration]. Check: sensor.integration->utility_meter. (See ?, line ?).

gostaria de saber também sobre as tarifas, visto que aqui no Brasil temos diferentes valores pela utilização, você fez algum tratamento para isto?

abaixo as alterações que fiz colocando dentro de sensor.yaml:

#Calculando consumo energético em reais

  - platform: template
    sensors:

      fase1:
        friendly_name: Fase 1
        unit_of_measurement: "W"
        value_template: "{{ (states('sensor.fase_1_power')|float)|round(2) }}"

      custo_mensal_energia:
        friendly_name: "Custo Mensal Energia"
        unit_of_measurement: 'R$'
        icon_template: mdi:currency-brl
        value_template: "{{ ((states.sensor.energia_mensal_normal.state | float) * (states.input_number.preco_kwh_energia.state | float)) | round(2) }}"

      custo_diario_energia:
        friendly_name: "Custo Diario Energia"
        unit_of_measurement: 'R$'
        icon_template: mdi:currency-brl
        value_template: "{{ ((states.sensor.energia_diaria_normal.state | float) * (states.input_number.preco_kwh_energia.state | float)) | round(2) }}"

  - platform: integration
    source: sensor.fase1
    name: energia_kwh_casa
    unit_prefix: k
    round: 2

    utility_meter:

      energia_diaria:
        source: sensor.energia_kwh_casa
        cycle: daily

        tariffs:
          - normal

      energia_mensal:
        source: sensor.energia_kwh_casa
        cycle: monthly

        tariffs:
          - normal

      custo_diario_energia_utility:
        source: sensor.custo_diario_energia
        cycle: daily

        tariffs:
          - normal

      custo_mensal_energia_utility:
        source: sensor.custo_mensal_energia
        cycle: monthly

        tariffs:
          - normal

Obrigado!

2 curtidas

Olá!
Puxa, parece que você colocou utility_meter, indentado abaixo de sensor. Ele não é debaixo de sensor.
Copie e cole do jeito que postei. Cole em Configuration.yaml . Pelo visto vc usa sensors.yaml, e tudo que colocar lá, vai ficar abaixo de sensor. Utility_meter não é exatamente um sensor…
O utility meter, serve como um registrador histórico e acumulativo (monthly(mensal)), de algum sensor que vc queira registrar e zerar com o tempo. É bem específico pra coisas diárias e mensais. Perfeito e até acho que foi feito, pra usar num registrador de consumo de energia. Um deles (o diario) , zera diariamente as 00:00:00 e o outro na virada de mês. Mais infos aqui: https://www.home-assistant.io/integrations/utility_meter/

Sobre a tarifa, peguei uma conta de luz, o valor total dividi pela quantidade de kWh consumido. Moro em SP-SP Capital, sendo que aqui deu 0,69 cents/kWh.

2 curtidas

Ah sim. Esqueci de comentar que utilizei um input number, pra lançar o valor do kWh do local que moro, assim não preciso editar diretamente no configuration.yaml
Segue abaixo o input_number no configuration.yaml

input_number:
  preco_kwh_energia:
    name: Preco kwh energia
    min: 0.01
    max: 3.00
    step: 0.01
    mode: box
1 curtida

Bruno Primeiramente Obrigado por compartilhar as informações , estou entrando nesse mundo agora ja encomendei meus 2 pzem pois tenho 2 fases e ate agora depois de muita pesquisa não achei nenhum tutorial informando como faz, vi que você conseguiu poderia tirar uma foto de suas conexões para mim faze igual aqui? Abraco

Bom dia Douglas!
Primeiramente, gostaria de parabenizá-lo pelo projeto e por compartilhar o conhecimento!

Estou dando os primeiros passos com o HA. Vou utilizar uma Raspberry Pi 4 como base do Hass.io e estou buscando projetos para poder atacar dois pontos de mais interesse: gerenciamento do consumo de água (achei um tópico interessante sobre isso) e gerenciamento do consumo de energia. Seu tópico está me servindo como a primeira referência para essa iniciatva.

A instalação da minha casa é trifásica. Você comentou no começo da publicação, que poderia usar 3 PZEMs pra atender essa demanda. Perguntas:

  1. Será que, na medição do consumo eu conseguiria unificar as leituras das 3 fases para ter essa informação consolidada?

  2. Recomenda que eu faça alguma análise antes da instalação (ex.: listagem da amperagem dos disjuntores) para evitar sobrecarga e danos nos módulos PZEMs e NodesMCU?

  3. Será que precisarei de um NodeMCU para cada PZEM?

Agradeço se puder esclarecer e ajudar.


Tomás Teixeira

O @MrPontesacredito que realizou esse processo. Ele pode orientar melhor.

Cara me tira uma dúvida, por favor!
Eu tenho um sensor de quanto tempo ficou ligada minha caixa de som, será que tem como eu fazer um cálculo de quanto foi gasto em R$ somente tendo essa informação, por mais que essas dados não sejam 100% corretos?