Monitorización del consumo eléctrico en remoto (Parte 2) con HomeAssistant


Como continuación de un post anterior donde probamos el popular sensor de consumo  PZEM004 junto con un simple sensor de humedad y temperatura ( DHT11) con un barato pero potente microcontrolador como es un ESP32, en este post vamos a dar un paso más, porque ya no nos vamos a conformar con ver las lecturas de temperatura, humedad, voltaje, corriente, frecuencia, potencia y factor de potencia en la consola de Arduino, ya que lo vamos a poder ver desde cualquier ordenador (y además guardando un histórico para poder estudiar con detenimiento como evoluciona nuestro consumo eléctrico a lo largo del tiempo).  

AVISO: Existen en el mercado multitud de dispositivos que cumplen este cometido pero desde este blog hemos preferido fabricarnos uno propio por muy poco dinero que es además ampliable en múltiples aspectos y lo mas importante : NO ES INVASIVO, es decir, no requiere que la línea con la corriente a medir pase por el dispositivo gracias al uso de un sensor de pinza , por tanto, su montaje y uso es más seguro. Este tutorial es avanzado y requiere tocar el cuadro eléctrico de la casa si queremos monitorizar el consumo global de nuestra vivienda o negocia lo que implica ciertos conocimientos de electricidad y electrónica, así como asegurar el corte total de la corriente antes de su manipulación.

EL circuito

En efecto como vimos en un post anterior donde probamos el sensor PZEM004 junto con un sensor DHT11 con  un ESP32, en este post vamos a dar un paso mas, vamos a poder ver las lecturas de temperatura, humedad, voltaje, corriente, frecuencia, potencia y factor de potencia desde cualquier ordenador (y además guardando un histórico ) gracias a la infraestructura de el HomeAssistant ( que vimos también en un post anterior).  

En cuanto a las conexiones, seguiremos un esquema bastante simple que ya vimos y que puede ajustarse a diversas necesidades y configuraciones. Como ya se comentado, se ha optado además del citado modulo sensor de consumo  PZEM004 , usar el clásico sensor de humedad y temperatura ( DHT11 ) y que hemos visto en numerosos proyectos de este blog. Por otra parte como »cerebro» usaremos el potente microcontrolador como es un ESP32, que gracias a su conectividad WIFI nos va a permitir enviar las medidas al HomeAssistent. Por ultimo el montaje se completa con una fuente sellada de 5V ultra-miniatura ( aunque un cargador USB debería también ser suficiente).

Los componentes como vemos son de los mas normales:

  • Un módulo  ESP32 que usaremos para obtener los datos del medidor y transmitirlos por Wi-Fi a nuestro servidor. Puedes encontrar distintos modelos en Amazon.
  • Medidor PZEM-004T V3 que puedes comprar en Amazon. También vale la versión 1, pero ofrece menos datos.
  • Un sensor DHT11 ( se puede comprar también en Amazon)
  • Una pinza / anillo de corriente CT. Normalmente incluido con el medidor, ha de aguantar como mínimo la intensidad límite que aguante la línea que vamos a medir. Puede elegir si usar una pinza, que, aunque no requiere la desconexión del cable que queremos medir, nos da unos datos menos precisos, o un anillo, que tiene más precisión, pero requiere que previamente pasemos el cable, con lo que habrá que desmontarlo.
  • Cables dupont para conectar ambos dispositivos ( hembra-hembra). Aunque lo ideal es realizar un circuito puedes usar cables dupont y una placa de desarrollo para realizar el tutorial.
  • Una fuente  selladade 5V de al menos 100mA , aunque puede usarse un cargador USB .Este tipo de fuente sellada por cierto la podemos encontrar de nuevo en Amazon.
  • Cables Azul y Marrón para enchufar el medidor PZEM-004T a la corriente.

Software

Se aconseja probar el circuito anterior primero con el sketch que ya vimos en un post anterior y cuando todas las medidas sean mostradas correctamente en la consola serie de Arduino, y el servidor homeassistant este funcionando, seguir con los siguientes pasos.

Primero vamos a meter el software generado con ESPHome al módulo ESP32 para lo cual tendremos que taner instalado en nuestro HomeAssistant el añadido de ESPHome.

Bien, una vez conectado el montaje a nuestro PC y el ESP32 con un cable USB a nuestro PC con el que ya cargamos el skecth de pruebas, vamos a cambiar totalmente el fw para que pueda entenderse este con el HomeAssistant.

El siguiente código es solo una plantilla que se puede adaptar a las necesidades de cada uno:


esphome:

name: "medidor-consumo-pzem004t"

platform: ESP32

board: nodemcu-32s




# Recuerda cambiar la plataforma y placa según corresponda a tu módulo ESP.

# https://esphome.io/components/esphome.html

# ESP8266: https://esphome.io/devices/nodemcu_esp8266.html

# ESP32: https://esphome.io/devices/nodemcu_esp32.html



wifi:

ssid: "AAAAAAAAAA"

password: "XXXXXXXXX"



manual_ip:

static_ip: 192.168.1.74

subnet: 255.255.255.0

gateway: 192.168.1.1







#Enable Home Assistant API

# API para que Home Assistant pueda conectarse al módulo

# https://esphome.io/components/api.html





api:

encryption:

key: "ZZZZZZZZZ"



# Servidor Web para poder consultar información por web

# https://esphome.io/components/web_server.html



web_server:

# port: 80



# Componente OTA para poder actualizar el módulo sin necesidad de cables

# https://esphome.io/components/ota.html







ota:

# password: "ZZZZZZZZZZZZZZZZZZZZZZ"



# Servidor Web para poder consultar información por web

# https://esphome.io/components/web_server.html



# Enable logging

logger:

#baud_rate: 0









# Indicamos los pines donde hemos conectado TX y RX del dispositivo, teniendo en cuenta que siempre han de ser invertidos TX->RX, RX->TX

uart:

rx_pin: 16

tx_pin: 17

baud_rate: 9600

# stop_bits solo es necesario si así lo indica el log mientras probamos el circuito

stop_bits: 1







# Enable fallback hotspot (captive portal) in case wifi connection fails

#ap:

# ssid: "Dht11Pzem004 Fallback Hotspot"

# password: "SSSSSSSSSSSSSSSSSSSSSS"



sensor:



#usamos un dht11

- platform: dht

pin: 4



temperature:

name: "Temperature"

unit_of_measurement: °C

humidity:

name: "Humidity"

unit_of_measurement: '%'

update_interval: 1s



# Usaremos pzemac o pzem004t dependiendo de si estamos usando un PZEM-004T V3 o V1

- platform: pzemac

address: 0xF8

current:

name: "Current"

voltage:

name: "Voltage"

energy:

name: "Energy"

power:

name: "Power"

frequency:

name: "Frequency"

power_factor:

name: "Power Factor"

update_interval: 1s





# Indicamos el pin del LED de la placa para que parpadee según su estado

# https://esphome.io/components/status_led.html

status_led:

pin: 2


Una vez hayamos metido nuestras credenciales de WIFI, generamos el binario compilado del archivo .yaml y lo metemos en el módulo ESP. Como siempre, se puede realizar por USB o si ya lo tenemos configurado previamente por OTA. Una vez listo pasamos al circuito.

Si pulsamos en el icono de la corriente podemos ver el seguimiento de las variaciones de la corriente a lo largo del tiempo.

El consumo lógicamente va incrementando de forma acumulativa como vemos en la siguiente imagen:

Asimismo poder ver el histórico del valor de la frecuencia:

Asimismo podemos ver la fluctuaciones de la potencia:

Asimismo también podemos ver la fluctuación del factor de potencia en un histórico y de ahí podríamos deducir la potencia reactiva.

Por ultimo podemos ver como el suministrador no nos suministra un valor de voltaje estable fluctuando en nuestro caso entre los valores de 240v y 250v.

Dado que hemos equipado al ESP32 con un DHT11 podemos asimismo ver las fluctuaciones de humedad y temperatura en el interior de nuestra vivienda.

Asimismo, dado que especificamos una IP fija también podemos ver las medidas junto a la traza a traves de la url especificada ( en nuestro caso http://192.168.1.74).

INSTALACION

Una vez bien probado la instalación, puede ser una buena idea incorporar el montaje a nuestra vivienda , pero por favor únicamente haga esto si tiene los conocimientos eléctricos suficientes dado el riesgo evidente de electrocución por lo que lo recomendable es cortar completamente el suministro de ca.

En primer lugar vamos a conectar el PZEM004 y el alimentador de 5v a la salida de un disjuntor con poca carga ( se recomienda antes de conectar los cables que efectivamente no hay tensión con un polímetro)

En el bloque donde solia ir el limitador ahí podemos ubicar nuestro montaje, eso si sin olvidar aislar al máximo todas las partes.

Ahora deberemos conectar la sonda de pinza en el lado activo de la general qeu sera la encargada de medir la corriente y con ello deducir la potencia, y el factor de potecnia

Ya solo nos queda cerrar el montaje y probar la funcionalidad

!Terminado el trabajo! Ahora ya solo nos queda ir a la la url http://homeassistant.local:8123/lovelace/0 desde un pc conectado a nuestra red y disfrutar del montaje.

Monitorización del consumo eléctrico y de la temperatura y humedad(Parte 1)


Dado el incremento histórico en los costos de la electricidad y la previsión de un continuo aumento, consideramos esencial contar con un método para evaluar el consumo eléctrico y identificar las áreas de la casa con mayor gasto energético. Esto nos permitirá optimizar el uso de la electricidad y, en última instancia, reducir nuestra factura. Una manera efectiva de lograr este objetivo es la instalación de medidores de consumo, ya sea a nivel de dispositivo o de la casa en su totalidad. En este post nos enfocaremos en la colocación de un medidor de consumo en el cuadro eléctrico para monitorizar el consumo de toda la vivienda , pues aunque hay numerosos dispositivos disponibles en el mercado para este propósito no siempre estan accesibles en tiempo real las medidas. Además adoptaremos una solución abierta  económica y no invasiva (esto significa que no es necesario que la línea eléctrica que se va a medir pase a través del dispositivo, lo cual hace que su instalación y uso sean más seguros).

Los componentes

El corazón del montaje es un Pzem004 , un módulo de prueba de monitorización eléctrica de alta precisión que viene además ya calibrado , muy económico ( unos 13€ en amazon) , autoalimentado ( ca 220v) y que incluye un transformador de corriente ( cerrado o con clip) para la medida de la corriente. Este mismo módulo incluso puede usarse para medir la energía, el voltaje y la corriente, y luego mostrarlo en un PC u otros terminales ofreciendo una precisión del 1%..

Ciertamente existen varias versiones con display que incluyen un botón de restablecimiento que puede restablecer los datos de energía simplemente pulsándolo, pero para el cometido de este post es mucho mejor usar la versión sin display dado que la idea es conectarlo a un microcontrolador y enviar las medidas para su análisis posterior (ya que de no ser así solo podemos verlas in situ y nos perderemos los valores históricos)

Gracias a que todas las versiones equipan un interfaz de comunicación de datos serie TTL, se puede leer y configurar los parámetros relevantes a través del puerto serie que podemos capturar con un microcontrolador como por ejemplo un potente ESP32, como vamos a ver en este post con una versión de los mas vendida: el ESP32 WROOM-32 (unos 12€ en amazon).

El AZDelivery ESP32 Dev Kit C V4, que corresponde al fabricante Espressif, combina en un solo microcontrolador una CPU con 2 núcleos de Tensilica LX6, con una frecuencia de reloj de hasta 240 MHz, y 512 kilobytes de SRAM. Para ello integra un aparato de radio para WLAN (802.11b/g/n) y Bluetooth (Classic y LE).

Con la nueva distribución de la placa, tanto la alimentación como el circuito de reset para la programación automática han sido mejorados significativamente. La versión  Dev-Kit está equipado con el ESP32-WROOM-32., módulo que a sido reposicionado por Espressif para lograr un aumento significativo en la calidad de transmisión y recepción, sin aumentar el rendimiento.

La función WLAN es compatible con todos los métodos de cifrado habituales, como WPA2. También puede actuar como punto de acceso o sniffer en la WLAN. Entre los más de 32 pines GPIO están disponibles: UART, I2C, SPI, DAC, ADC (12 Bit), todos los pines GPIO pueden utilizarse como entrada o salida.

Conectándolo todo

Usando la Biblioteca Arduino para Peacefair  en un ESP32 y un PZEM-004T-100A v3.0 podemos construir un Monitor de energía usando la interfaz ModBUS.

Antes de empezar ,debemos saber que la versión 3.0 PZEM es una versión mejorada de la anterior PZEM-004T, siendo las principales características de este módulo son las siguientes;

  • Mide voltaje, corriente, potencia, energía, factor de potencia y frecuencia (nuevo en la versión 3.0).
  • 247 direcciones esclavas programables únicas.
  • Permite que múltiples esclavos usen la misma interfaz serial PZEM MulitDevice Demo
  • Contador de energía interna hasta 9999.99kWh.
  • Alarma de sobrealimentación.
  • Puesta a cero del contador de energía.
  • Suma de comprobación CRC16.
  • Mejor, pero no perfecto aislamiento de red.

También destacar que existe ya actualmente una nueva versión versión con exactamente las mismas especificaciones pero con soporte de RS485 ( como tratamos en este post) , lo cual a efectos prácticos nos puede interesar en caso de necesitar usar múltiples dispositivos de medidas sobre el mismo bus de medidas.

Especificaciones del fabricante para el PZEM004 v3
FUNCIÓNRANGO DE MEDICIÓNRESOLUCIÓNPRECISIÓN
Voltaje80~260V0.1V0,5%
Actual0~10A o 0~100A*0.01A o 0.02A*0,5%
Poder activo0~2,3kW o 0~23kW*0.1W0,5%
energía activa0~9999.99kWh1Wh0,5%
Frecuencia45~65Hz0,1 Hz0,5%
Factor de potencia0,00~1,000.011%
*Uso del transformador de corriente externo en lugar del derivador incorporado

Este módulo, es una versión mejorada del PZEM-004T con funciones de medición de frecuencia y factor de potencia, disponible en los lugares habituales. Se comunica mediante una interfaz TTL a través de un protocolo de comunicación similar a Modbus-RTU, pero es incompatible con la biblioteca @olehs anterior que se encuentra aquí: https://github.com/olehs/PZEM004T

Para hacer mas interesante la propuesta además al circuito un simple medidor de temperatura y humedad «clásico» como el módulo DHT11. Este sensor lee la temperatura y humedad del lugar donde está el sensor. Tiene dos pines para alimentación («-» para la tierra, el pin central es VCC). El pin con la etiqueta «S» es la entrada de pin. Las lecturas se reciben a través de este pin.

Los componentes empleados necesarios para el montaje propuesto pues son los siguientes:

El circuito

En cuanto a las conexiones, seguiremos un esquema bastante simple que puede ajustarse a diversas necesidades y configuraciones. Se ha optado además del citado modulo PZEM004, añadir un sensor de temperatura y humedad (el DHT11 ) así como para darle mayor estabilidad un fuente sellada de 5V ultra-miniatura ( aunque un cargador USB debería también ser suficiente).

El esquema propuesto del montaje queda como en la siguiente imagen :

A continuación para que quede mas claro exponemos las principales conexiones con el ESp32:

NodeMCU ESP32SPZEM004-T V3Fuente 5v DCDHT11
5V5VRojo/+/VCC/5V 5V
GNDGNDNegro/-/GND GND
GPIO16TX  
GPIO17RX  
GPIO 5 DATA (PIN CENTRAL)
Resumen de conexiones importantes del ESP32 con el DHT11 y PZEM004

ATENCION: La Fase y el Neutro se conectarán a la corriente directa de la casa. Dentro del anillo toroidal para la medición de la corriente ( que puede ser en forma de pinza o no ), deberemos pasar el cable de la Fase (color Negro) sobre el cual deseamos llevar a cabo las mediciones, que puede ser el mismo que utilizamos para suministrar corriente al circuito o no.

Debemos destacar la importancia de verificar si los módulos ESP permiten la salida de corriente de 5V por el pin, ya que esto puede variar según el modelo. En caso de alimentar el módulo ESP desde un cable USB y suministrar energía al módulo PZEM-004T mediante sus pines 5V/VCC y GND, es esencial confirmar que estos pines puedan proporcionar la corriente necesaria. Mencionar además la intención de llevar a cabo pruebas según el esquema propuesto y luego realizar un montaje más seguro dentro del cuadro eléctrico.

MUCHO CUIDADO: Para que ciertamente este montaje no conlleve ningún peligro, dado qeu va alñimentado directamente con ca 220V , debemos aislar ambas placas (por ejemplo en una caja de conexiones) para asegurarnos de que no recibimos ninguna descarga eléctrica fortuita especialmente del PZEM004 .

Código Arduino

Una vez tengamos listo el montaje, antes de incluso integrarlo en Home Assistant que veremos en un nuevo post, es muy interesante cerciorarnos que el montaje funciona correctamente, para lo cual en el ambiente de Arduino deberíamos probar algún mínimo código que nos ratifique que el montaje es correcto.

Teniendo el montaje bien revisado, debemos seleccionar desde el interface de Arduino «ESP Dev Module» y asegurarnos de haber configurado el puerto serie correcto.

Con el siguiente código lo cargaremos y los desplegaremos en el microcontrolador pulsando la flecha derecha ( deploy) y ya podemos probar las funcionalidades abriendo el monitor serie.

#include <PZEM004Tv30.h>
#include "DHT.h"

#define DHTPIN 4 // Digital pin connected to the DHT sensor

// Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 --

// Pin 15 can work but DHT must be disconnected during program upload.



// Uncomment whatever type you're using!

#define DHTTYPE DHT11 // DHT 11

//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321

//#define DHTTYPE DHT21 // DHT 21 (AM2301)



// Connect pin 1 (on the left) of the sensor to +5V

// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1

// to 3.3V instead of 5V!

// Connect pin 2 of the sensor to whatever your DHTPIN is

// Connect pin 4 (on the right) of the sensor to GROUND

// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor



// Initialize DHT sensor.

// Note that older versions of this library took an optional third parameter to

// tweak the timings for faster processors. This parameter is no longer needed

// as the current DHT reading algorithm adjusts itself to work on faster procs.

DHT dht(DHTPIN, DHTTYPE);




//inicializacion de los contadores

PZEM004Tv30 pzem0(Serial2, 16, 17);

float puerto;



String Imprimir3;

/**variables genericas para capturar todas las medidas*/

float voltage,current ,power, frequency,pf;



void setup() {


Serial.begin(9600);

Serial.println(F("DHTxx test!"));


dht.begin();

pinMode(2,OUTPUT);

// Uncomment in order to reset the internal energy counter

pzem0.resetEnergy();



}





void loop() {



Serial.print("Custom Address:");

//Serial.println(pzem.readAddress(), HEX);

//Serial.println(pzem.readAddress());


Serial.println(pzem0.getAddress());

//Custom Address:248

//Error reading voltage



puerto=pzem0.getAddress();


Serial.print("Read Custom Address:");

Serial.println(puerto);


if (puerto>0)

{


digitalWrite(2,HIGH);

Serial.print("Medidor 0 :( ");

Serial.print(pzem0.readAddress(), HEX);

Serial.print(") Medidas: ");


// Read the data from the sensor

voltage = pzem0.voltage(); //Volt

current = pzem0.current(); //Amp

power = pzem0.power(); //watt

//float energy = pzem0.energy(); //kwh

frequency = pzem0.frequency(); //hz

pf = pzem0.pf();




Serial.print ("M0 AGREGADO I=");

Serial.print (current);


Serial.print (" W=");

Serial.print (power);


Serial.print (" pf=");

Serial.print (pf);


Serial.print (" V=");

Serial.print (voltage);



Serial.print (" f=");

Serial.print (frequency);


// Serial.println ((String)voltage+";"+(String)current+";"+(String)power+";"+(String)frequency+";"+(String)pf);

// Wait a few seconds between measurements.

delay(2000);


// Reading temperature or humidity takes about 250 milliseconds!

// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)

float h = dht.readHumidity();

// Read temperature as Celsius (the default)

float t = dht.readTemperature();

// Read temperature as Fahrenheit (isFahrenheit = true)

float f = dht.readTemperature(true);



// Check if any reads failed and exit early (to try again).

if (isnan(h) || isnan(t) || isnan(f)) {

Serial.println(F("Failed to read from DHT sensor!"));

return;

}



// Compute heat index in Fahrenheit (the default)

float hif = dht.computeHeatIndex(f, h);

// Compute heat index in Celsius (isFahreheit = false)

float hic = dht.computeHeatIndex(t, h, false);



Serial.print(F("Humidity: "));

Serial.print(h);

Serial.print(F("% Temperature: "));

Serial.print(t);

Serial.print(F("°C "));

Serial.print(f);

Serial.print(F("°F Heat index: "));

Serial.print(hic);

Serial.print(F("°C "));

Serial.print(hif);

Serial.println(F("°F"));

}

}

Destacar que aunque este código no será necesario en la integración con Home Assitant, pero si es conveniente antes de desplegarlo en el ESP32 , para probar que el montaje funciona correctamente y que no nos hemos equivocado en nada , ya que el código Arduino anterior es funcional al 100% .

Os mostramos como hemos probado el montaje antes de llevarlo su ubicación junto al cuadro de distribución de ca:

Si hemos desplegado el código anterior correctamente los dos leds TX/RX del PZEM004 deberían parpadear al unísono y desde la consola serie de Arduino ver todas la lecturas de tensión, corriente, potencia, frecuencia, factor de potencia así como la temperatura y la humedad. !buena suerte!.