Medidor de consumo no invasivo, con ESP, y tasmota

Hoy os explicaremos como instalar y configurar un medidor de consumo no invasivo en nuestro cuadro general, y controlarlo mediante un ESP8266 con tasmota, además le incorporaremos una pantalla para observar los consumos desde el propio cuadro.

El objetivo de este tutorial es dejarlo todo bastante explicado para que cualquiera pueda realizarlo aunque tenga poca idea del tema, sin tener que recurrir a otras guías publicadas anteriormente

PREPARATIVOS

A continuación os detallamos el material necesario. Puesto que los materiales no deben reunir ningún requisito especial, no hemos adjuntado links de compra para evitar malentendidos con los referidos

  • ESP8266, en este caso se ha usado un NodeMcu ESP 12E, pero es replicable con weemos d1, lolines y demás.
  • Una pantalla con interface I2C, probablemente se pueda usar otra pero no lo he probado.
  • Un conversor de 220VAC a 5VDC
  • Un medidor de consumo no invasivo PZEM-004T (si lo veis sin el conector usb casi que mejor, porque no se va a usar)

Para hacer funcionar todo este material necesitaremos:

  • El arduino IDE, yo he usado la versión 1.8.5 porque es con la que he conseguido que la cosa funcione

INSTALACIÓN DEL SOFTWARE

Una vez se tiene todo se instala (instalador) o se descomprime (portable) el arduino IDE y ANTES DEL PRIMER ARRANQUE DEL PROGRAMA, se crea una carpeta llamada “portable” dentro de la carpeta de Arduino, bien en Documentos/Mis Documentos/Arduino/libraries en el caso de instalar o en la carpeta donde hayamos descomprimido el portable


Al descomprimir la carpeta de tasmota tendremos las librerías necesarias en la carpeta lib, tan solo hay que copiar el contenido de esta carpeta a la carpeta libraries de arduino bien en

Documentos/Mis Documentos/Arduino/libraries

en el caso de instalar o en la carpeta donde hayamos descomprimido el portable.

Después, reemplazaremos el archivo platform.txt que está en

Documentos/Mis Documentos/Arduino/portable/packages/esp8266/hardware/esp8266/2.5.0

con el que hay en la carpeta del firm de tasmota, en

 arduino/version 2.5.0/platform.txt

Tras copiar las librerías, arrancamos el Arduino IDE y bajamos las librerías de la tarjeta ESP8266 para poder trabajar con ella de la siguiente manera:

  • En archivo/preferencias, se introduce en Gestor de URLs adicionales de tarjetas la siguiente dirección: http://arduino.esp8266.com/stable/package_esp8266com_index.json
  • Después se va a herramientas/placas/gestión de tarjetas:
  • Ahora en la barra de búsqueda ponemos ESP8266 y saldrá el siguiente controlador, el cual tenemos que instalar (usaremos la versión 2.5.0 que es la que corresponde con el archivo platform.txt que cambiamos anteriormente):
  • Tras instalar el controlador ya aparecerán un listado de placas esp8266 en la gestión de placas, y seleccionaremos en este caso la siguiente configuración:

El puerto será el correspondiente a nuestra placa, es posible que se tengan que instalar drivers CH340 para que el ordenador la reconozca.

  • Una vez se tiene seleccionada la placa, hay que hacer un par de modificaciones en el código del firm, para lo que abriremos el archivo sonoff.ino que se encuentra en a carpeta que hemos bajado de tasmota, carpeta sonoff:

Tras seleccionar el tipo de placa, vamos a la carpeta donde tenemos el firm de Tasmota y dentor de la carpeta sonoff, abrimos el archivo sonoff.ino y se abrirán una serie de pestañas dentro del IDE de arduino.

Nos iremos a la pestaña my_user_config. Una vez en esa pestaña, en el apartado wifi pondremos las credenciales de la red a la que queremos conectarnos (está en las líneas del principio):

Lo que está entre comillas tiene que ir entre comillas, no se quitan

(para buscar estas líneas puede usarse el buscador pulsando CTRL+F)

//
-- Wifi ----------------------------------------

Esto se queda así si queremos ip dinámica, si queremos estática la fijamos

#define
WIFI_IP_ADDRESS   "0.0.0.0"
  // [IpAddress1] Set to 0.0.0.0 for using DHCP or enter a static IP
address 

Aquí ponemos la ip del router que tenga la red

#define
WIFI_GATEWAY           "192.168.1.1"
    // [IpAddress2] If not using DHCP set Gateway IP address #define
WIFI_SUBNETMASK        "255.255.255.0"   // [IpAddress3] If
not using DHCP set Network mask
#define
WIFI_DNS               "192.168.1.1"
    // [IpAddress4] If not using DHCP set DNS IP address (might be
equal to WIFI_GATEWAY) 

Aquí definimos los parámetros de la wifi a la que queremos conectarnos

#define
STA_SSID1              "aquívaelnombredetuwifi"
               // [Ssid1] Wifi SSID
#define
STA_PASS1              "aquítupassword"
               // [Password1] Wifi password

Si queremos que el lenguaje del Sistema esté en español, bajamos hasta la línea:

//#define
MY_LANGUAGE            es-AR           // Spanish in Argentina

Y se le quitan las barras del principio, quedando así:

#define
MY_LANGUAGE            es-AR           // Spanish in Argentina

En caso contrario se quedaría en inglés

Ahora bajamos hasta la línea que pone:

//
 #define USE_DISPLAY                            // Add I2C Display
Support (+2k code)

Y se le quitan las barras del principio, quedando así:

#define
USE_DISPLAY                            // Add I2C Display Support
(+2k code)

Si se quiere configurar los parámetros mqtt se hará en el apartado:

#define
MQTT_HOST              "aquí
se pone la ip"
               // [MqttHost]
#define
MQTT_FINGERPRINT1      "A5 02 FF 13 99 9F 8B 39 8E F1 83 4F 11
23 65 0B 32 36 FC 07"  // [MqttFingerprint1]
#define
MQTT_FINGERPRINT2      "A5 02 FF 13 99 9F 8B 39 8E F1 83 4F 11
23 65 0B 32 36 FC 07"  // [MqttFingerprint2]
#define
MQTT_PORT              1883              // [MqttPort] MQTT port
(10123 on CloudMQTT)
#define
MQTT_USER              "usuario
mqtt"
      // [MqttUser] MQTT user
#define
MQTT_PASS              "password
mqtt"
      // [MqttPassword] MQTT password

Ahora para securizar la conexión vía web, pondremos un password:

//
-- HTTP ----------------------------------------
#define
WEB_SERVER  2   // [WebServer] Web server (0 = Off, 1 = Start as
User, 2 = Start as Admin)
#define
WEB_PASSWORD  "aquítupassword"
 // [WebPassword] Web server Admin mode Password for WEB_USERNAME
(empty string = Disable)
#define
FRIENDLY_NAME "Sonoff"   // [FriendlyName] Friendlyname up
to 32 characters used by webpages and Alexa
#define
EMULATION  EMUL_NONE   // [Emulation] Select Belkin WeMo (single
relay/light) or Hue Bridge emulation (multi relay/light) (EMUL_NONE,
EMUL_WEMO or EMUL_HUE)

Por defecto el usuario será “admin” sin las comillas.

Salvamos cambios en la pestaña Archivo.

Una vez realizadas las modificaciones, se conectará el NodeMCU vía USB pulsando el botón flash mientras se conecta el cable, y tras seleccionar el puerto correcto en herramientas/puerto, se subirá el firm:

En la parte de debajo de la pantalla de programa se verá una barra de progreso a la derecha que pondrá compilando, tras unos minutos, en la parte negra saldrá una barra de progresión consistente en puntos rojos con un porcentaje al final de cada línea, finalizando la grabación al llegar al 100%.

CONFIGURACIÓN DEL ESP

En ese punto, desconectamos el usb y conectamos de nuevo para que se inicie el firm

  • Cuando se inicie el firm el esp8266 se conectará a la wifi con una ip asignada por el router en caso de no haberla definido o la que le hayamos definido anteriormente. Para poder descubrir cuál es usaremos fing en un teléfono conectado a la misma wifi o cualquier programa que analice la red a la que estamos conectados en el pc.

Tras localizarla se pondrá en la barra de direcciones del navegador y se abrirá un cuadro de diálogo en el que pedirá el nombre de usuario (admin) y el password que será el que hemos definido anteriormente.

  • Tras acceder a la web de gestión de Tasmota, lo primero que tenemos que definir es el tipo de placa que estamos utilizando para que sepa qué entradas tiene, para ello iremos a la sección “configuration”, “configure module” y allí seleccionaremos el tipo de placa 18 “generic”. Tras salvar, la placa se reinicia
  1. Una vez se reinicie volveremos al mismo punto y tendremos las siguientes entradas que configuraremos como se muestra:

De esta forma quedan definidas qué entradas serán para la captación de los datos del GPIO 1 y 3 como Tx y Rx del medidor de potencia respectivamente, y GPIO 4 y 5 como SDA y SCL de la pantalla. Podemos poner también un botón para encender y apagar la pantalla seleccionando en GPIO0 Button1 el modo “button1” y meter en el GPIO2 un sensor de temperatura y humedad DHT11, seleccionando DHT11 en el desplegable; esto es optativo

Salvamos y la placa se reiniciará otra vez.

Esta vez en la pantalla principal ya aparecerán una seria de valores que son los que medirá el PZEM y que se muestran en dicha pantalla por comodidad, de una forma similar a esta (la foto de la derecha es con el DHT11):

Ahora pasamos al cableado en el que debería quedar así:

Con este esquema todo funciona correctamente siempre que el nodeMCU se alimente por usb, ya que el PZEM funciona a 5 voltios. (La pantalla es OLED es posible que no se encienda nada hasta que no se configure.

Es recomendable si no se va a tener acceso al ESP una vez montado, que se monte un botón de reset por si fuera necesario resetar el integrado. Para ello, simplemente montaremos un segundo botón que una el pin reset (bajo la línea amarilla que va del TX del PZEM al D7) con cualquiera de los pines de tierra (G) que tiene la placa.

Por la bobina del PZEM-004T tiene que pasar SOLO el cable de fase (marrón) para que pueda medir (si es un cable que va a enchufe y el medidor no lee, girar el enchufe ya que las fases pueden estar cambiadas). En el PZEM-004T, donde pone AC va la alimentación a 220 Voltios alterna, aprovecharemos esa clema para sacar un segundo juego de cables y conectar ahí la fuente 220VAC-5VDC y poder alimentar nuestro NodeMCU, yo lo he hecho con un cable usb de móvil que he cortado, conectando el cable rojo al positivo de la fuente y el negativo al negro.

CONFIGURACION DE LA PANTALLA

Después de eso ya solo queda el definir y configurar la pantalla. Para ello iremos al apartado Console de la página principal de la web de nuestro tasmota, donde tenemos un apartado inferior donde mandar comandos al equipo:

Ahí tendremos que usar el comando I2Cscan (ejecutamos escribiéndolo en la consola y pulsando intro) para que busque la pantalla y nos de la dirección lógica de la misma. Nos la dará en hexadecimal y será del tipo 0x3f o similar. Ahora tendremos que traducirla a decimal, por ejemplo en la web https://www.binaryhexconverter.com/hex-to-decimal-converter y nos dará el valor que corresponda (en el caso del ejemplo es 63).
Escribimos en la consola DisplayAddress seguido del número decimal que hemos obtenido, en el caso del ejemplo

DisplayAddress 63

y pulsamos intro.

Ahora fijaremos el tiempo de refresco con el comando TelePeriod. El mínimo tiempo son 10 segundos por valor, luego pondremos

TelePeriod
10 

y pulsaremos intro de nuevo.

Ahora toca decir qué tipo de pantalla usamos y qué datos y como queremos que nos los enseñe. Está recogido en su web https://github.com/arendst/Sonoff-Tasmota/wiki/Displays, os la pongo aquí porque aunque lo explique en el tuto podéis ver si meten alguna nueva funcionalidad o modo más adelante.

El tipo de pantalla lo fijamos con el comando DisplayModel, y tenemos las siguientes opciones de pantallas soportadas:

Si por ejemplo quisiéramos usar una pantalla oled 12864, pondríamos

DisplayModel 2 (En caso de ser una LCD2004 sería 1)

y pulsaríamos intro, con la dirección hexadecimal veremos la que tenemos. Por ejemplo, si I2CScan nos da un valor de 0x3C, el modelo a seleccionar será el tipo 2.

Por defecto la pantalla un área de pantalla de 8 columnas por 2 filas, por lo que en caso de usar una oled de 128×64 puntos, tendremos que fijar el área de pantalla en 20 columnas por 8 filas, o en las que queramos que tenga, para ello, utilizaremos los siguientes comandos:

DisplayCols para el número de columnas y DisplayRows para el número de filas, así, por ejemplo, si queremos fijar el ejemplo anterior lanzaremos los comandos:

DisplayCols
20

DisplayRows 8 (para la pantalla LCD 2004 el valor sería 4)

En caso de que la pantalla esté girada, se podrá rotar la imagen en la pantalla con el comando:

DisplayRotate y un valor de 0 a 3, donde 0 rota 0º, 1, rota 90º, 2 rota 180º y 3 rota 270º

Para el tipo de datos que queremos que nos muestre tenemos estas opciones y se definen con el parámetro DisplayMode :

Se seleccionará el modo de visualización con el comando DisplayMode. En un principio vamos a seleccionar el valor 2 con DisplayMode 2 (si la pantalla es LCD2004 seleccionamos el modo 0). A estas alturas la pantalla debería estar encendida, en caso contrario, hay que verificar que en la pantalla principal de tasmota ponga ON, en caso contrario pulsaremos el botón toggle (en castellano creo que lo pone como secuenciar) y debería encenderse (si es oled no se enciende si no muestra datos, así que si no muestra nada reinicia el NodeMCU y debería mostrar la info de arranque, en caso contrario repite la configuración que algo raro hay)

Si ya hemos visto que todo funciona, vamos a usar el modo 4 para poder definir qué queremos que nos muestre. Podríamos usar el modo 2 pero hay información que en mi caso prefiero que no muestre como puede ser el factor de potencia porque no me aporta mucho y además lo muestra con los nombres ingleses de cada sensor, así que vamos a definir una regla con lo que queremos que nos muestre. La sintaxis está definida en el link de la página anterior. Con esta orden se muestra info de potencia instantánea, consumo del día, voltaje, intensidad y consumo total acumulado en una pantalla oled de 20 columnas por 8 filas, y tiene los espacios necesarios para que quede alineado:

Reglas para OLED y pantallas 12864:

Rule1 ON Tele-ENERGY#Power DO DisplayText Potencia:   %value%W ENDON ON Tele-ENERGY#Today DO DisplayText Consumo:    %value%Wh ENDON ON Tele-ENERGY#Voltage DO DisplayText Voltaje:    %value%V ENDON ON Tele-ENERGY#Current DO DisplayText Intensidad: %value%A ENDON ON Tele-ENERGY#Total DO DisplayText Total:      %value%kWh ENDON on tele-DHT11#Temperature do DisplayText Temp:       %value% C endon on tele-DHT11#Humidity do DisplayText Humedad:    %value%% endon

Para esta regla hay que seleccionar después:

Displaymode 4

Si queremos que se muestre de forma no rotativa la información, se puede hacer de esta manera:

Rule1 ON Tele-ENERGY#Power DO DisplayText [z] [x0y0]Potencia:   %value%W ENDON ON Tele-ENERGY#Current DO DisplayText [x0y9]Intensidad: %value%A ENDON  
ON Tele-ENERGY#Voltage DO DisplayText [x0y18]Voltaje:    %value%V ENDON ON Tele-ENERGY#Today DO DisplayText [x0y27]Consumo:    %value%KWh ENDON ON Tele-ENERGY#Yesterday DO DisplayText [x0y36]Ayer:       %value% Kwh ENDON ON Tele-ENERGY#Total DO DisplayText [x0y45]Total:      %value% Kwh on tele-DHT11#Temperature do DisplayText [x0y54]Temp: %value% C endon on tele-DHT11#Humidity do DisplayText [x72y54]  Hum:%value%% endon

y en este caso seleccionaremos:

Displaymode 0

Reglas para LCD2004:

Rule1 ON Tele-ENERGY#Today DO DisplayText [z] [x0y0]Consumo:    %value%KWh ENDON ON Tele-ENERGY#Power DO DisplayText [x0y1]Potencia:   %value%W ENDON ON Tele-ENERGY#Current DO DisplayText [x0y2]Intensidad: %value%A ENDON  
ON Tele-ENERGY#Voltage DO DisplayText [x0y3]Voltaje: %value%V ENDON

Rule2  ON Tele-ENERGY#Total DO var1 %value% ENDON ON tele-DHT11#Temperature DO var2 %value% ENDON ON tele-DHT11#Humidity DO backlog var3 %value%; delay 45; DisplayText [z]; DisplayText [x0y0]Total:       %var1%kWh; DisplayText [x0y1]Temp:       %var2% C; DisplayText [x0y2]Humedad:    %var3%%; DisplayText [x0y3] [t]; DisplayText [x12y3] [T] ENDON   Temp:       %var2% C; DisplayText [x0y2]Humedad:    %var3%%; DisplayText [x0y3] [t]; DisplayText [x12y3] [T] ENDON 

Para esta regla hay que seleccionar después:

Displaymode
0

Con esta sintaxis en una pantalla oled muestra los valores ordenados y cuadrados, pero podéis poner la que mejor os venga. Si es mucho lío con la opción DisplayMode 2 os muestra toda la info sin problema.

Después hay que activar la regla con el comando:

Rule1
1

Para la segunda regla:

Rule2
1

Si necesitáis desactivarla, simplemente con poner

Rule1
0

Se desactiva

Con esto debería funcionar todo sin problema, espero que os sirva para animaros a hacer vuestro propio contador!

INTEGRACIÓN EN HOME ASSISTANT

Para integrar las lecturas en Home assistant, tendremos que definir los sensores como MQTT de la siguiente manera (aquí se ha definido el topic como “contador”, y se supone que en la configuración MQTT de tasmota se ha seleccionado como full topic %prefix%/%topic%/ )

sensor:
- platform: mqtt
name: "Voltage"
state_topic: "tele/contador/SENSOR"
value_template: "{{ value_json['ENERGY'].Voltage }}"
unit_of_measurement: "V"
- platform: mqtt
name: "Current"
state_topic: "tele/contador/SENSOR"
value_template: "{{ value_json['ENERGY'].Current }}"
unit_of_measurement: "A"
- platform: mqtt
name: "Power"
state_topic: "tele/contador/SENSOR"
value_template: "{{ value_json['ENERGY'].Power }}"
unit_of_measurement: "W"
- platform: mqtt
name: "Power Factor"
state_topic: "tele/contador/SENSOR"
value_template: "{{ value_json['ENERGY'].Factor}}"
unit_of_measurement: ""
- platform: mqtt
name: "Energy Today"
state_topic: "tele/contador/SENSOR"
value_template: "{{ value_json['ENERGY'].Today }}"
unit_of_measurement: "kWh"
- platform: mqtt
name: "Energy Yesterday"
state_topic: "tele/contador/SENSOR"
value_template: "{{ value_json['ENERGY'].Yesterday }}"
unit_of_measurement: "kWh"
- platform: mqtt
name: "Energy Total"
state_topic: "tele/contador/SENSOR"
value_template: "{{ value_json['ENERGY'].Total }}"
unit_of_measurement: "kWh"
- platform: mqtt
name: "Humedad"
state_topic: "tele/contador/SENSOR"
value_template: "{{ value_json['DHT11'].Humidity }}"
unit_of_measurement: "%"
- platform: mqtt
name: "Temperatura"
state_topic: "tele/contador/SENSOR"
unit_of_measurement: "ºC"
value_template: "{{ value_json['DHT11'].Temperature }}"

Pues eso es todo, como siempre, si tienes cualquier duda déjanos tu comentario o pásate por el grupo de telegram de @Domology

Fuentes:

Un comentario sobre “Medidor de consumo no invasivo, con ESP, y tasmota

Deja un comentario

Síguenos

Siguenos en facebook