Shelly EM, controla electricidad de casa y fotovoltáica con Grafana

Una gran duda es como optimizar nuestro gasto eléctrico para ahorrar en la factura de la luz. Para ello vamos a usar el Shelly EM que nos va a permitir saber los gastos y las horas en las que consumimos electricidad. Para ello vamos a capturar los datos en InfluxDB y mostrarlos con Grafana.

¿Qué es Shelly?

Shelly Logo

Shelly es una marca perteneciente al fabricante búlgaro Allterco Robotics. Diseñan productos pensados para ser utilizado en aplicaciones domóticas. Son dispositivos de bajo coste pero de un gran potencial. Tienes la oportunidad de usar sus servidores para controlar el dispositivo desde cualquier lugar o para mostrar estadísticas en su app. Además tenemos la opción de conectarlo con nuestro propio servidor MQTT.

Shelly EM

Es el dispositivo de dimensiones reducidas que usaremos para controlar el consumo que tenemos en casa. Las mediciones las realiza mediante una pinza amperimétrica de forma no invasiva.

El EM tiene posibilidad de instalar 2 pinzas y tiene un rele de poca intensidad que puede activar un contactor para controlar cargas mayores.

Existen 2 tipos de pinzas de 50 amperios y de 120 amperios. No es necesario cambiar el EM para usar un tipo de pinza u otro, ya que permite configurarla incluso mezclar pinzas de 50 y 120.

Además existe una versión para poderla usar en sistemas trifásicos. El Shelly 3EM puede usarse tanto para sistemas trifásicos como para monofásicos controlando 3 zonas con sus 3 pinzas.

No se pudo mostrar la tabla.

Instalación

La instalación es simple, sólo necesitamos instalar el medidor dentro del cuadro general y alimentarlo desde uno de los diferenciales para que empiece a funcionar. El sistema de cogida de los cables es mediante unos pequeños tornillos.

Diagrama Instalación Shelly EM
Esquema de Instalación de Shelly EM

Pondremos la pinza en el cable del Fase que nos llega desde la compañía eléctrica para que nos mida la electricidad que gastamos. Al contrario de otros sistemas, no es necesario manipular en exceso nuestra instalación, ya que las pinzas son de sistema clip, por lo que no es necesario desconectar ningún cable.

En nuestro caso, vamos a medir también la electricidad de los paneles solares fotovoltáicos que tenemos instalados y por ello necesitamos el segundo medidor. Esta segunda pinza hay que comprarla adicionalmente ya que en el kit normal sólo viene una pinza. Aunque existen distribuidores que nos la venden con el kit de dos pinzas.

Configuración

Para la configuración tendremos que crearnos una cuenta en la APP para conectarla a nuestra red Wifi.

No vamos a entrar en detalles, solo es acceder y darle a configurar nuevo dispositivo.

Si queremos tener las gráficas en la aplicación debemos activar la opción de Cloud.

Aplicacion Shelly
Aplicación Shelly

En nuestro caso, sólo usaremos la aplicación para que nuestro dispositivo se conecte a nuestra red para luego poder acceder a el desde nuestra red.

InfluxDB

Logo InfluxDB

InfluxDB es un servidor de Base de datos desarrollado en GO y optimizado para obtener rapidez en los datos. Los datos que almacenan son serie de tiempo (timeseries).

Instalación de InfluxDb en Docker

Aunque se puede instalar como es lógicamente en el sistema base, por rapidez y comodidad vamos a instalarlo en docker.

El comando para ejecutarlo es:

docker run --name InfluxDB -d -p 192.168.1.100:8086:8086 -v /datos/InfluxDB/data:/var/lib/influxdb influxdb:1.8

Con esto tendremos InfluxDB funcionando en la IP 192.168.1.100 de nuestro equipo, lógicamente esa IP tiene que existir ya en él. Los datos se almacenarán en /datos/InfluxDB/data. Lógicamente estos datos se tienen que adaptar a nuestro equipo y nuestra red.

No hemos configurado la seguridad, por lo que no necesitamos usuario y password. Si lo queremos securizar podemos hacerlo estableciendo las variables necesarias.

Creación de la Base de datos

Ahora sólo nos queda crear la base de datos que vamos a usar

curl -G http://192.168.1.100:8086/query --data-urlencode "q=CREATE DATABASE meter"

Con esta petición creamos una base de datos llamada meter, que será donde se almacenarán los datos.

Captura de datos

Ahora que tenemos el Shelly EM instalado y el InfluxDB configurado con su correspondiente Base de datos, sólo nos queda recolectar los datos desde el Shelly e introducirla en nuestra base de datos.

Para ello el propio Shelly EM tiene una opción de obtener datos en formato JSON. Para ello tenemos que hacer una petición a http://IP_SHELLY/emeter/CANAL . El canal es 0 y 1 siendo 0 el correspondiente al meter 1 y el 1 al correspondiente al meter 2. Aunque en el diagrama anterior, he puesto el canal 0 como fotovoltáico y el 1 como el que viene de la empresa distribuidora, ha sido por comodidad al diseñar. Ésto es lo que obtenemos:

{
  "power": 357.57,
  "reactive": -238.54,
  "voltage": 229.3,
  "is_valid": true,
  "total": 22595.6,
  "total_returned": 4871.2
}

Aquí de lo que obtenemos y lo que nos interesa es el power y el voltage. Ya que con esto sabremos que tensión tenemos y la potencia que es lo más nos suele importar.

Para facilitarlo he creado este script en bash el cual es totalmente configurable tanto en las IPs como en el medidor que hemos usado para la empresa distribuidora o para el sistema solar:

#!/bin/bash

###############################################
##   Script para obtener datos de Shelly EM
##        e introducirlos  en Influx DB
##
##              www.alferez.es
###############################################

IP=192.168.1.100
PUERTO=8086
BBDD=meter

SHELLY=192.168.1.101
CASA=0
SOLAR=1

### Datos de lectura General de Operadora

DATOS=$(curl -s $SHELLY/emeter/$CASA)

LOG=/tmp/meter.log

if [ "$(echo $DATOS | jq .is_valid)" == "true" ]
then
	/usr/bin/curl -s -i -XPOST "http://${IP}:${PUERTO}/write?db=${BBDD}" --data-binary "volt,meter=general value=$(echo $DATOS|jq .voltage)"
        /usr/bin/curl -s -i -XPOST "http://${IP}:${PUERTO}/write?db=${BBDD}" --data-binary "power,meter=general value=$(echo $DATOS|jq .power)"
	if [ "$(echo $DATOS|jq .power)" > 0 ] && [ "$(echo $DATOS|jq .voltage)" > 0 ]
	then
		AMPS=$(bc <<< "scale=2; $(echo $DATOS|jq .power) / $(echo $DATOS|jq .voltage)")
		/usr/bin/curl -s -i -XPOST "http://${IP}:${PUERTO}/write?db=${BBDD}" --data-binary "amps,meter=general value=$AMPS"
	else
		/usr/bin/curl -s -i -XPOST "http://${IP}:${PUERTO}/write?db=${BBDD}" --data-binary "amps,meter=general value=0"
	fi
	echo "$(date +'%d/%m/%Y %H:%M:%S') CASA: V:$(echo $DATOS|jq .voltage) W:$(echo $DATOS|jq .power) A:$AMPS" >> $LOG
fi


### Datos de Fotovoltaica (Si no tienes Placas Solares, puedes anularlo)

DATOS=$(curl -s $SHELLY/emeter/$SOLAR)

if [ "$(echo $DATOS | jq .is_valid)" == "true" ]
then
	/usr/bin/curl -s -i -XPOST "http://${IP}:${PUERTO}/write?db=${BBDD}" --data-binary "volt,meter=solar value=$(echo $DATOS|jq .voltage)"
	/usr/bin/curl -s -i -XPOST "http://${IP}:${PUERTO}/write?db=${BBDD}" --data-binary "power,meter=solar value=$(echo $DATOS|jq .power)"
	if [ $(echo $DATOS|jq .power) -gt 0 ] && [ $(echo $DATOS|jq .voltage) -gt 0 ]
	then
		AMPS=$(bc <<< "scale=2; $(echo $DATOS|jq .power) / $(echo $DATOS|jq .voltage)")
                /usr/bin/curl -s -i -XPOST "http://${IP}:${PUERTO}/write?db=${BBDD}" --data-binary "amps,meter=solar value=$AMPS"
	else
		/usr/bin/curl -s -i -XPOST "http://${IP}:${PUERTO}/write?db=${BBDD}" --data-binary "amps,meter=solar value=0"
	fi
	echo "$(date +'%d/%m/%Y %H:%M:%S') SOLAR: V:$(echo $DATOS|jq .voltage) W:$(echo $DATOS|jq .power) A:$AMPS" >> $LOG
fi

Obtenemos los datos y calculamos los amperios, ya que no los obtenemos directamente. Con todos los datos los almacenamos en la BBDD, teniendo en cuenta que tenemos un campo llamado meter. Éste campo tiene el valor «general» para el que nos mide a la entrada general de la vivienda y «solar» que nos mide lo que las placas solares generan.

Ya tenemos todos los datos metidos, ahora nos queda poder ver esos datos de forma que nos sirva para algo.

Grafana

Logo Grafana

Grafana es una herramienta que interpreta visualmente datos de serie temporales. Es la herramienta complementaria perfecta de InflugDB, ya que nos permite tener en forma gráfica la interpretación de los datos almacenados.

Instalación de Grafana en Docker

Al igual que montamos InfluxDB en Docker, con Grafana no lo vamos a hacer de forma distinta. Cómo es lógico y como ya pasaba con InfluxDB se puede montar en el propio sistema.

Podemos ejecutarlo directamente, pero vamos a sacar la configuración antes para que podamos tocar datos de esa configuración en un futuro:

docker run --name=Grafana -d grafana/grafana
docker cp Grafana:/etc/grafana/. /datos/Grafana/etc/
docker rm -f Grafana
mkdir -m 777 /datos/Grafana/data
mkdir -m 777 /datos/Grafana/logs

Con la configuración ya disponible, podemos lanzar el docker de Grafana que vamos a usar para conectar y mostrar esos datos:

docker run --name=Grafana -d -p 192.168.1.100:3000:3000 -v /datos/Grafana/data:/var/lib/grafana -v /datos/Grafana/etc:/etc/grafana -v /datos/Grafana/logs:/var/logs/grafana grafana/grafana

Con esto ya podemos acceder a la IP que le hemos dado en nuestro ejemplo: http://192.168.1.100:3000

Bienvenida Grafana
Por defecto el usuario es admin con password admin

Configuración de Grafana

Desde el apartado de configuración, puedes establecer distintos parámetros, como usuarios, Zona horaria, … A nosotros lo que más nos importa y en la que vamos a profundizar de este apartado es en la configuración del origen de datos (data source)

Configuración del data source

En la siguiente pantalla podemos ver los datos que necesitamos para enlazar con nuestro source de InfluxDB

Configuracion data source InfluxDB en Grafana

Creación del Dashboard

Con el datasource ya configurado, nos queda mostrar gráficamente esos datos, que es lo que queremos conseguir con Grafana.

Al añadir el panel, tenemos distintos tipos, en mi caso he usado dos tipos:

  • Graph
  • Gauge

En esta captura podemos ver la configuración tanto de la captura de datos de W de la empresa distribuidora como los generados por la instalación fotovoltáica:

Grafana W Endesa
Configuración de W de distribuidora
Grafana W Placas Solares
Configuración de W desde las placas solares

Desde el datasource Meter, dame power cuando el meter = [general|solar] cada 1m y es una serie de tiempo.

Aquí podéis ver la pantalla que yo he creado:

Panel de Grafana con Datos de InfluxDB
Dashboard para Grafana

Si queréis aquí os dejo mi Dashboard para que podáis importarlo y usarlo o tomarlo como plantilla.

Ahorro en la factura de la luz

Con estos datos, ya podemos ver cual es nuestra rutina de consumo. Por ejemplo podemos ver nuestro consumo eléctrico base, que es lo que consumen nuestros equipos durante todo el día. En mi caso está en unos 350w.

Sabiendo esto, podemos ver que podemos conectar o desconectar para bajar ese consumo, si nuestro frigorífico hace unos grandes picos de consumos porque no es eficiente. También cuando poner la lavadora en el momento de menor consumo. O si nos interesa contratar una tarifa con discriminación horario.

Ahora ya tenemos datos para poder tomar este tipo de decisiones.