Recibiendo datos de EspHome sin Home Assistant


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 intentar capturar las medidas sin el HA (Home Assistant) las lecturas de temperatura, humedad, voltaje, corriente, frecuencia, potencia y factor de potencia desde cualquier ordenador.  

En cuanto a las conexiones, seguiremos el mismo 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 . 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 HA este funcionando, seguir con los siguientes pasos. Si te estas preguntando porque necesitamos HA si el titulo del post era precisamente lo contario, en mi defensa diré que vamos a usar Esphome finalmente pero para configurarlo necesitamos HA.

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 del ESP32 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: Vamos a desglosar la sintaxis de este fichero de configuración para ESPHome:

Encabezado y Configuración Básica

esphome:
  name: "medidor-consumo-pzem004t"  # Nombre del dispositivo
  platform: ESP32  # Plataforma utilizada (ESP32)
  board: nodemcu-32s  # Placa específica utilizada

Configuración de WiFi

wifi:
  ssid: "AAAAAAAAAA"  # Nombre de la red WiFi
  password: "XXXXXXXXX"  # Contraseña de la red WiFi

  manual_ip:
    static_ip: 192.168.1.74  # IP estática del dispositivo
    subnet: 255.255.255.0  # Máscara de subred
    gateway: 192.168.1.1  # Puerta de enlace

API para Home Assistant

api:
  encryption:
    key: "ZZZZZZZZZ"  # Clave de encriptación para la API

Servidor Web

web_server:
   port: 80  # Puerto del servidor web (opcional)

Actualización OTA

ota:
  # password: "ZZZZZZZZZZZZZZZZZZZZZZ"  # Contraseña para OTA (opcional)

Registro de Logs

logger:
  # baud_rate: 0  # Tasa de baudios para el registro (opcional)

Configuración UART

uart:
  rx_pin: 16  # Pin RX
  tx_pin: 17  # Pin TX
  baud_rate: 9600  # Tasa de baudios
  stop_bits: 1  # Bits de parada (opcional)

Sensores

Sensor DHT11

sensor:
  - platform: dht
    pin: 4  # Pin donde está conectado el sensor DHT11
    temperature:
      name: "Temperature"  # Nombre del sensor de temperatura
      unit_of_measurement: °C  # Unidad de medida
    humidity:
      name: "Humidity"  # Nombre del sensor de humedad
      unit_of_measurement: '%'  # Unidad de medida
    update_interval: 1s  # Intervalo de actualización

Sensor PZEM-004T

  - platform: pzemac
    address: 0xF8  # Dirección del dispositivo PZEM-004T
    current:
      name: "Current"  # Nombre del sensor de corriente
    voltage:
      name: "Voltage"  # Nombre del sensor de voltaje
    energy:
      name: "Energy"  # Nombre del sensor de energía
    power:
      name: "Power"  # Nombre del sensor de potencia
    frequency:
      name: "Frequency"  # Nombre del sensor de frecuencia
    power_factor:
      name: "Power Factor"  # Nombre del sensor de factor de potencia
    update_interval: 1s  # Intervalo de actualización

LED de Estado

status_led:
  pin: 2  # Pin del LED de estado

Este fichero configura un dispositivo ESP32 con varios sensores y funcionalidades, incluyendo conexión WiFi, API para Home Assistant, servidor web, actualización OTA, y registro de logs. Cada sección tiene su propósito específico y se puede ajustar según las necesidades del proyecto usando todos los sensores que necesitemos.

Home Assistant en un PC

En efecto puedes ejecutar Home Assistant en un PC. Aunque muchas personas optan por usar una Raspberry PI 3 o similar , dada la potencia de calculo necesaria no siempre es la mejor opción. Bajo mi opinión un NUC o un viejo portatil es mas idónea.

La manera mas rapida y fácil es crear una imagen de HA Core en un USB , forzar el arranque desde USB e instalarla ( pero esto formateara el disco del PC ). También hay algunas otras opciones para hacerlo:

1. Usar una Máquina Virtual

Puedes instalar Home Assistant en una máquina virtual utilizando software como VirtualBox o VMware. Aquí tienes los pasos básicos:

  1. Descargar e instalar VirtualBox:
    • Ve a la página de descargas de VirtualBox y descarga la versión correspondiente a tu sistema operativo.
    • Instala VirtualBox siguiendo las instrucciones del instalador.
  2. Descargar la imagen de Home Assistant:
  3. Crear una nueva máquina virtual:
    • Abre VirtualBox y crea una nueva máquina virtual.
    • Selecciona «Linux» como tipo de sistema operativo y «Other Linux (64-bit)» como versión.
    • Asigna al menos 2 GB de RAM y 32 GB de almacenamiento.
    • Usa la imagen de Home Assistant descargada como disco duro virtual.
  4. Configurar la red:
    • Configura el adaptador de red como «Adaptador puente» para que la máquina virtual tenga acceso a la red local.
  5. Iniciar la máquina virtual:
    • Inicia la máquina virtual y espera a que Home Assistant se configure.
    • Accede a Home Assistant desde tu navegador usando la dirección IP de la máquina virtual y el puerto 8123.

2. Usar Docker

Otra opción es ejecutar Home Assistant en un contenedor Docker. Aquí tienes los pasos básicos:

  1. Instalar Docker:
    • Ve a la página de Docker y descarga Docker Desktop para tu sistema operativo.
    • Instala Docker siguiendo las instrucciones del instalador.
  2. Ejecutar Home Assistant en Docker:
    • Abre una terminal y ejecuta el siguiente comando para descargar y ejecutar Home Assistant:docker run -d --name homeassistant --restart=unless-stopped -p 8123:8123 -v /path/to/your/config:/config --network=host ghcr.io/home-assistant/home-assistant:stable
    • Reemplaza /path/to/your/config con la ruta donde quieres almacenar la configuración de Home Assistant.
  3. Acceder a Home Assistant:
    • Abre tu navegador y ve a http://localhost:8123 para acceder a Home Assistant.

3. Instalar Home Assistant Core

También puedes instalar Home Assistant Core directamente en tu sistema operativo usando Python. Aquí tienes los pasos básicos:

  1. Instalar Python:
    • Asegúrate de tener Python 3.8 o superior instalado en tu PC.
  2. Crear un entorno virtual:
    • Abre una terminal y ejecuta los siguientes comandos:python3 -m venv homeassistant cd homeassistant source bin/activate
  3. Instalar Home Assistant Core:
    • Con el entorno virtual activado, instala Home Assistant Core:pip install homeassistant
  4. Iniciar Home Assistant:
    • Ejecuta Home Assistant:hass
  5. Acceder a Home Assistant:
    • Abre tu navegador y ve a http://localhost:8123 para acceder a Home Assistant.

ACCESO SIN HOMEASSISTANT AL ESPHOME

Puedes capturar las medidas devueltas desde el interfaz web de ESPHome para después olvidarnos de Home Assistant. Veamos las opciones:

1. Usar el Servidor Web de ESPHome

ESPHome permite configurar un servidor web en el dispositivo, desde el cual puedes acceder a los datos de los sensores. Aquí tienes los pasos básicos:

  1. Configurar el servidor web en ESPHome: Asegúrate de tener la siguiente configuración en tu archivo YAML de ESPHome:web_server: port: 80
  2. Acceder al servidor web:
    • Una vez que el dispositivo esté configurado y conectado a tu red WiFi, abre un navegador web.
    • Ingresa la dirección IP del dispositivo en la barra de direcciones (por ejemplo, http://192.168.1.74).
    • Verás una página con los datos de los sensores configurados.

2. Usar Solicitudes HTTP (Webhooks)

Puedes configurar ESPHome para enviar datos a un servidor externo mediante solicitudes HTTP. Aquí tienes un ejemplo de cómo hacerlo:

  1. Configurar el sensor para enviar datos: Añade la siguiente configuración a tu archivo YAML de ESPHome:http_request: url: http://tu-servidor.com/endpoint method: POST headers: Content-Type: application/json body: '{"temperature": "{{ temperature }}", "humidity": "{{ humidity }}"}'
  2. Configurar una automatización para enviar los datos:automation: - alias: "Enviar datos del sensor" trigger: platform: time at: '00:00:00' action: - http_request.post: url: http://tu-servidor.com/endpoint json: temperature: !lambda 'return id(temperature).state;' humidity: !lambda 'return id(humidity).state;'

3. Usar MQTT

Otra opción es usar MQTT para enviar los datos a un broker MQTT, desde donde puedes capturarlos con otros servicios o aplicaciones.

  1. Configurar MQTT en ESPHome: Añade la siguiente configuración a tu archivo YAML de ESPHome:mqtt: broker: "192.168.1.10" username: "usuario" password: "contraseña"
  2. Configurar los sensores para publicar en MQTT:sensor: - platform: dht pin: 4 temperature: name: "Temperature" state_topic: "home/sensor/temperature" humidity: name: "Humidity" state_topic: "home/sensor/humidity"

4. Usar Node-RED

Node-RED es una herramienta de programación visual que puede capturar y procesar datos de ESPHome mediante HTTP o MQTT.

  1. Instalar Node-RED:
    • Puedes instalar Node-RED en tu PC o en un servidor.
    • Configura un flujo para recibir datos de ESPHome mediante HTTP o MQTT.
  2. Configurar un nodo HTTP o MQTT en Node-RED:
    • Configura un nodo HTTP para recibir datos desde ESPHome.
    • Configura un nodo MQTT para suscribirse a los temas de los sensores de ESPHome.

Estas son algunas formas de capturar medidas desde el interfaz web de ESPHome sin tener instalado Home Assistant.

MANERA DE CAPTURAR LOS DATOS DE MEDIDA DESDE PYTHON

Ya que tenemos el servidor web de ESPHome configurado y funcionando, puedes recuperar los datos de las medidas en tiempo real y guardarlos en un fichero utilizando un script en Python. Aquí tienes un ejemplo de cómo hacerlo:

Paso 1: Instalar las Dependencias

Primero, asegúrate de tener Python instalado en tu PC. Luego, instala las bibliotecas necesarias:

pip install requests

Paso 2: Crear el Script en Python

Crea un archivo llamado recuperar_datos.py y añade el siguiente código:

import requests
import time
import csv

# URL del servidor web de ESPHome
url = "http://192.168.1.74"

# Ruta del fichero CSV donde se guardarán los datos
csv_file = "medidas.csv"

# Función para recuperar los datos del servidor web
def obtener_datos():
    response = requests.get(url)
    if response.status_code == 200:
        return response.json()
    else:
        print("Error al obtener los datos")
        return None

# Función para guardar los datos en un fichero CSV
def guardar_datos(datos):
    with open(csv_file, mode='a', newline='') as file:
        writer = csv.writer(file)
        writer.writerow([
            time.strftime("%Y-%m-%d %H:%M:%S"),
            datos.get("Current"),
            datos.get("Energy"),
            datos.get("Frequency"),
            datos.get("Humidity"),
            datos.get("Power"),
            datos.get("Power Factor"),
            datos.get("Temperature"),
            datos.get("Voltage")
        ])

# Encabezados del fichero CSV
with open(csv_file, mode='w', newline='') as file:
    writer = csv.writer(file)
    writer.writerow([
        "Timestamp", "Current", "Energy", "Frequency", "Humidity", "Power", "Power Factor", "Temperature", "Voltage"
    ])

# Bucle para recuperar y guardar los datos periódicamente
while True:
    datos = obtener_datos()
    if datos:
        guardar_datos(datos)
    time.sleep(60)  # Esperar 60 segundos antes de la siguiente lectura

Paso 3: Ejecutar el Script

Ejecuta el script en tu terminal:

python recuperar_datos.py

Este script hará lo siguiente:

  1. Obtener los datos del servidor web de ESPHome.
  2. Guardar los datos en un fichero CSV con un timestamp.
  3. Repetir el proceso cada 60 segundos.

Hablemos del nuevo pzem-004t-100a-d-p(v1.0) y su uso practico


Amigos lectores , probablemente recordareis el famoso modulo de medida electrica PZEM004. Ciertamente la versión PZEM-004T V3.0 o versión 3.0 era la versión actualizada para reemplazar la antigua PZEM004T V1.0 dado que la versión anterior se ha agotado desde hace bastante tiempo en la mayor parte de las tiendas en línea y ya no se producen ( de hecho se necesitan librerías especiales para poder usarlo). La versión actualizada de PZEM004T sigue siendo interesante para proyectos, donde necesitamos medir el voltaje, la corriente, la potencia, la energía, la frecuencia, el factor de potencia (la frecuencia y el PF se agregan adicionales en la nueva versión) utilizando Arduino / ESP8266 -ESP32/ /Raspberry Pi como plataforma de código abierto.

Ahora bien, si bien PZEM-004T V3.0 o versión 3.0 sigue siendo una versión funcional por el momento, desde hace un año aproximadamente, tenemos disponible una nueva versión: la versión PZEM-004T-100A-D-P (v1.0). Esta nueva versión ser caracteriza por su mayor precisión y respuesta rápida, con una versión mejorada de pulso de PIN que facilita la integración en PCB y la medición de potencia con menor error de calibración.

Utiliza una interfaz de comunicación UART a TTL con una velocidad de baudios de 9600, y emplea el protocolo Modbus-RTU para la capa de aplicación, soportando funciones como lectura de registros, escritura de registros, calibración y limpieza de potencia cero. La comprobación CRC se realiza en un formato de 16 bits con un polinomio específico.

En cuanto a los parámetros del producto, el modelo Pzem-004t-100A-d-p v1.0 (como el antiguo PZEM-004T V3.0) permite medir corrientes de hasta 100A y voltajes entre 80 y 260V, con una potencia activa máxima de 2.3KW y un factor de potencia de hasta 1.00. La frecuencia operativa va de 45Hz a 65Hz, y cuenta con una función de alarma para exceso de potencia. La comunicación se realiza a través de una interfaz TTL, y el dispositivo opera en un rango de temperatura de -20℃ a +60℃.

Este es el aspecto del nuevo modelo donde como vemos se puede observar que el diseño se ha cambiado para poder soldar el modulo en una placa o incluso enchufar en una placa proto board prescindiendo de conectores.

Asimismo tenemos un nuevo pin: el pin CF de salida de pulsos, por lo que también han cambiado el diseño incluyendo un nuevo optoacoplador en la propia placa

El pin CF (Frequency Output) en el PZEM-004T-100A-D-P (v1.0) se utiliza para proporcionar una salida de frecuencia proporcional a la potencia activa medida. Esta señal de frecuencia puede ser utilizada para monitorear y registrar el consumo de energía en tiempo real, y mas adelante en el código arduino veremos cual es su utilidad.

Como en versiones anteriores, la interfaz TTL de este módulo es una interfaz pasiva y necesita una fuente de alimentación externa de 5V, es decir, los cuatro puertos (5V, RX, TX y GND) debe estar conectado durante la comunicación; de lo contrario, la comunicación falla.

Por ultimo la temperatura de funcionamiento del modulo va entre -20 ℃ ~ + 60 ℃.

Conexiones con un ESP32

Las conexiones no han cambiado respecto a la configuraciones antiguas a excepción de que tenemos un hilo mas( el pin CF) .Para conectar el PZEM-004T-100A-D-P (v1.0) al ESP32 WROOM 32 usando los GPIO 16, 17 y 4, sigue estos pasos:

Conexiones de alimentación:

  • Conecta el pin VCC del PZEM-004T al pin de 5V del ESP32.
  • Conecta el pin GND del PZEM-004T al pin GND del ESP32.

Conexiones de comunicación:

  • Conecta el pin RX del PZEM-004T al pin GPIO 16 (TX2) del ESP32.
  • Conecta el pin TX del PZEM-004T al pin GPIO 17 (RX2) del ESP32.
  • Conecta el pin CF del PZEM-004T al pin GPIO 4 del ESP32.

Conexión de la entrada de CA:

  • Conecta los terminales de entrada de CA del PZEM-004T a la fuente de alimentación de CA que deseas medir. Asegúrate de seguir las precauciones de seguridad al trabajar con corriente alterna.
  • Conexión de la bobina del sensor de corriente:Pasa el cable de la carga a través del agujero de la bobina del sensor de corriente (CT) del PZEM-004T. Esto permitirá medir la corriente que pasa a través del cable.

A continuación podemos ver el esquema del montaje final:

Ejemplo de código ARduino probado con la nueva versión del PZEM004

El siguinte nuevo código Arduino con el pzem004 le permite medir el voltaje de CA, la corriente de CA, la potencia, la energía, la frecuencia y el factor de potencia en la interfaz serie con el microcontrolador Arduino. Ademas tambien usaremos leos pulsos CF .

La biblioteca de PZEM-004t V30 funciona tanto en serie de hardware como en serie de software con este nuevo modulo. El resultado de todos los parámetros se imprime en el monitor serie de Arduino IDE. Este código de biblioteca se ha usado con un ESp32 pero debería funcionar también con arduino uno, arduino mega y nano board.

CODIGO ARDUINO:

#include <PZEM004Tv30.h>
#include <HardwareSerial.h>

// Definir los pines de conexión
#define RX_PIN 17
#define TX_PIN 16
#define CF_PIN 5

// Crear una instancia del objeto HardwareSerial
HardwareSerial PZEMSerial(2);

// Crear una instancia del objeto PZEM
PZEM004Tv30 pzem(PZEMSerial, RX_PIN, TX_PIN);

// Variables para contar los pulsos del pin CF
volatile unsigned long pulseCount = 0;
unsigned long lastPulseTime = 0;

void IRAM_ATTR onPulse() {
  pulseCount++;
  lastPulseTime = millis();
}

void setup() {
  Serial.begin(115200);
  Serial.println("Iniciando PZEM004T con ESP32");

  // Iniciar la comunicación serial con el PZEM
  PZEMSerial.begin(9600, SERIAL_8N1, RX_PIN, TX_PIN);

  // Configurar el pin CF como entrada y adjuntar la interrupción
  pinMode(CF_PIN, INPUT);
  attachInterrupt(digitalPinToInterrupt(CF_PIN), onPulse, RISING);
}

void loop() {
  // Leer las variables eléctricas
  float voltage = pzem.voltage();
  float current = pzem.current();
  float power = pzem.power();
  float energy = pzem.energy();
  float frequency = pzem.frequency();
  float pf = pzem.pf();

  // Mostrar las variables en el monitor serie
  Serial.print("Voltaje: "); Serial.print(voltage); Serial.println(" V");
  Serial.print("Corriente: "); Serial.print(current); Serial.println(" A");
  Serial.print("Potencia: "); Serial.print(power); Serial.println(" W");
  Serial.print("Energía: "); Serial.print(energy); Serial.println(" Wh");
  Serial.print("Frecuencia: "); Serial.print(frequency); Serial.println(" Hz");
  Serial.print("Factor de Potencia: "); Serial.println(pf);

  // Mostrar el conteo de pulsos del pin CF
  Serial.print("Pulsos CF: "); Serial.println(pulseCount);

  // Esperar un segundo antes de la siguiente lectura
  delay(1000);
}

Este código Arduino configura un ESP32 para comunicarse con un módulo PZEM-004T-100A-D-P (v1.0) a través de los pines RX (17) y TX (16), y utiliza el pin CF (5) para contar pulsos de frecuencia. En el setup, se inicializa la comunicación serial y se configura una interrupción en el pin CF.

El pin CF (Frequency Output) del PZEM-004T-100A-D-P (v1.0) se utiliza para proporcionar una señal de frecuencia que es proporcional a la potencia activa medida por el módulo. Esta señal de frecuencia puede ser utilizada para monitorear y registrar el consumo de energía en tiempo real.

En el código Arduino, el pin CF está conectado al GPIO 5 del ESP32 y se configura una interrupción para contar los pulsos generados por el pin CF. Cada pulso representa una cantidad específica de energía consumida, y al contar estos pulsos, se puede calcular el consumo total de energía.

Aquí un resumen de cómo se usa el pin CF en el código:

  1. Configuración del pin CF: En el setup, se configura el pin CF como entrada y se adjunta una interrupción para contar los pulsos.
  2. Interrupción: La función onPulse se llama cada vez que se detecta un pulso en el pin CF, incrementando el contador de pulsos.
  3. Lectura de pulsos: En el loop, se muestra el conteo de pulsos en el monitor serie, lo que permite monitorear el consumo de energía en tiempo real.

Por ultimo en el loop, se leen y muestran en el monitor serie las variables eléctricas (voltaje, corriente, potencia, energía, frecuencia y factor de potencia) y el conteo de pulsos del pin CF, con un retraso de un segundo entre lectura.

A continuación para terminal un ejemplo de salida del monitor serie usando el montaje explicado:

Espero amigo lector que si adquiera un modulo de estos, sepa darle utilidad.