sábado, 7 de septiembre de 2013

Medidor de consumo eléctrico EnviR (parte 2)

... haciendo uso de nuestros conocimientos multidisciplina

Hola de nuevo, en el post anterior comentaba como conectarnos y sacar los datos de EnviR. En este post vamos a instalar un servidor Mysql donde registrar los datos, generar alarmas/eventos e integrarlo con la domótica.

Instalación

Antes de nada, instalamos:
apt-get update
apt-get install mysql-server apache2 phpmyadmin
cuando instala Mysql nos preguntará varias cosas, si no sabemos de que habla, elegiremos las opciones por defecto. Nos pide la clave del servidor Mysql, usuario, cliente Mysql, permisos para las BBDD ... si eres un vago y estas haciendo pruebas, ponle la misma clave que al usuario root, te dará menos dolores de cabeza. Si quieres dejar esto en un sistema en producción, ni se te ocurra hacerlo.
Ahora creamos la BBDD y la tabla donde guardar los registros. Como soy buena gente te dejo aquí el archivo sql:
wget https://www.dropbox.com/s/63g6f3yfoe6ngoj/EnviR.sql -O /tmp/EnviR.sql
mysql -u root -p < /tmp/EnviR.sql

Procesamiento de datos

He creado un script que filtra, guarda y procesa los datos /usr/local/bin/recoge_datos_envir.sh :
#!/bin/bash
host=localhost
user=root
pass=PASS_MYSQL
db=EnviR
tbl=registros
sql="/usr/bin/mysql -h $host -u $user -p$pass -e "
gtalk=USUARIO_RECIBE_ALERTAS@gmail.com
xml=/tmp/envir/salida.xml

##### TEMPERATURAS TERMOSTATO #####
temperaturaArranqueAire=31
temperaturaParadaAire=24
temperaturaArranqueCalefaccion=10
temperaturaParadaCalefaccion=20
###################################

##### CONSUMO ELECTRICO #####
alarmaConsumoMAX=3000
alarmaIncremento=1000
#############################


orden=$(cat $xml | tail -1 | grep msg | sed 's/</\ /g' | sed 's/>/\ /g' | sed 's/\///g' | sed 's/\ \ /\ /g' | cut -f10,13,16,19,26 -d\ )

if [ "$orden" != "" ];
then
 fecha=$(echo $(echo $(date +%F) && echo $orden | cut -f1 -d\ ) | sed 's/\ /_/g');
 temp=$(echo $orden | cut -f2 -d\ );
 sensor=$(echo $orden | cut -f3 -d\ );
 sensorID=$(echo $orden | cut -f4 -d\ );
 watts=$(echo $orden | cut -f5 -d\ );
 $sql 'insert into '$db'.'$tbl' (fecha,temperatura,sensor,sensorID,watts) VALUES ("'$fecha'","'$temp'","'$sensor'","'$sensorID'","'$watts'")';
 
 ##### CONDICIONALES DE TEMPERATURA #####
 if (( $(echo "$temp < $temperaturaArranqueCalefaccion" | bc -l) ));
 then
  echo activar calefaccion;
  echo "Evento a las: `date`: se enciende la calefaccion, la temperatura es de $temp" | centerim -s msg -p jab -t $gtalk;
 fi
 
 if (( $(echo "$temp > $temperaturaParadaCalefaccion" | bc -l) ));
        then
                echo parar calefaccion;
  echo "Evento a las: `date`: se apaga la calefaccion, la temperatura es de $temp" | centerim -s msg -p jab -t $gtalk;
        fi

 if (( $(echo "$temp > $temperaturaArranqueAire" | bc -l) ));
 then
  echo activar aire acondicionado;
  echo "Evento a las: `date`: se enciende el aire acondicionado, la temperatura es de $temp" | centerim -s msg -p jab -t $gtalk;
 fi

        if (( $(echo "$temp < $temperaturaParadaAire" | bc -l) ));
        then
                echo parar aire acondicionado;
  echo "Evento a las: `date`: se apaga el aire acondicionado, la temperatura es de $temp" | centerim -s msg -p jab -t $gtalk;
        fi
 ########################################


 ##### CONDICIONALES DE CONSUMO #####
 if (( $(echo "$watts > $alarmaConsumoMAX" | bc -l) ));
        then
  if [ -f /tmp/watts_alarma.log ];
         then
   en_alarma=$(cat /tmp/watts_alarma.log);
   if [ "$en_alarma" = "0" ];
   then
    echo se consume demasiado;
    echo 1 > /tmp/watts_alarma.log;
    echo "Evento a las: `date`: el consumo electrico es de $watts" | centerim -s msg -p jab -t $gtalk;
   fi
  else
   echo 1 > /tmp/watts_alarma.log;
   echo se consume demasiado;
   echo "Evento a las: `date`: el consumo electrico es de $watts" | centerim -s msg -p jab -t $gtalk;
  fi
 else
  if [ -f /tmp/watts_alarma.log ];
                then
                        en_alarma=$(cat /tmp/watts_alarma.log);
                        if [ "$en_alarma" = "1" ];
   then
    echo consumo electrico reestablecido;
    echo 0 > /tmp/watts_alarma.log;
    echo "Evento a las: `date`: el consumo electrico se ha reestablecido a $watts" | centerim -s msg -p jab -t $gtalk;
   fi
  else
                        echo 0 > /tmp/watts_alarma.log;
  fi
 fi

 if [ -f /tmp/watts_anterior.log ];
 then
  watts_anterior=$(cat /tmp/watts_anterior.log);
  if (( $(echo "$watts - $watts_anterior > $alarmaIncremento" | bc -l) ));
  then
   echo se incrementa el consumo en mas de $alarmaIncremento hasta los: $watts;
   echo "Evento a las: `date`: el consumo electrico se incrementa en mas de $alarmaIncremento hasta los: $watts" | centerim -s msg -p jab -t $gtalk;
  fi
 fi
 echo $watts > /tmp/watts_anterior.log;
 #####################################
fi
Es fácil de entender, tendréis que hacer vuestros ajustes de acceso a Mysql y completarlo con vuestras necesidades. Yo lo veo fácil, pero si no entiendes algo pregúntame. Para configurar las alertas por Gtalk (Hangouts (Conversaciones)) pásate por este post.

Puesta en marcha

Para que se ejecute al arrancar el Raspberry, añadimos esta línea al archivo /etc/rc.local :
screen -dmS EnviR /bin/bash /usr/local/bin/recoge_datos_envir.sh
guardamos y reiniciamos con todo enchufado. Desde el momento en el que arranque estará guardando los datos y actuando en los diferentes eventos. Podemos ver los registros con nuestro cliente favorito de Mysql o desde http://ip_del_raspberry/phpmyadmin

El resto lo dejo en vuestras manos, esto es un "yo me lo guiso yo me lo como". Me consta que la gente de Cliensol está aprovechando esto (y más cosas) para hacer un interfaz web la mar de currao, compatible con nuestros Androids, iphones, tablets y pcs, generando gráficas, consulta de históricos y demás. Si no tienes tiempo, o no quieres complicarte la vida, ponte en contacto con ellos ;)

ACTUALIZACIÓN!!!!

me he saltado una de las partes más importantes ¿cómo paso los datos del xml al script?
Fácil, la línea de antes del /etc/rc.local la ELIMINAMOS, y mejor usamos incron. Puedes usar como ejemplo este post, en el que explico paso a paso como usar incron y capturar el evento que queremos. Despues ejecutamos incrontad -e y la orden se quedaría más o menos:
/tmp/envir/salida.xml IN_MODIFY /bin/bash /usr/local/bin/recoge_datos_envir.sh
Asegúrate de que tu evento es IN_MODIFY, si no lo es, pon el que más se ajuste.

12 comentarios:

  1. OOOOOLEEEE!

    A ver si me pongo un día, recopilo tus post, y me pongo manos a la obra! El tema del consumo eléctrico cada vez es mas importante, y mas caro xD de hecho, leí el otro día, que un ordenador de 500 w todo un año puede consumir perfectamente 350 €!!! No se si será así, pero es cuestión de tenerlo en cuenta.

    Saludos!

    ResponderEliminar
    Respuestas
    1. Hombre tampoco es asi, aunque tu ordenador tenga una fuente de 500W eso es el máximo que puede dar la fuente. Normalmente y con la pantalla apagada la mayor parte del tiempo la media de consumo no creo que supere los 80W, multiplicado por 24h y 365 dias son 700kW al año, a 0,15€/kW eso es 105€ al año.

      Eliminar
  2. Interesantes como siempre tus posts.

    No hace mucho que me hice con una Raspberry Pi y cada día le veo mas utilidades, sobre todo en el ámbito de la domótica. La que uso yo no es de la convencional: PLC+Pantalla y bus AS-i.

    Unas de las primeras cosas que hice, fue tener un elemento de control de consumo. Asi que opte por instalar en el armario del PLC y potencia un analizador de redes de Circuitor, el CVM-SP e implemente en el PLC el protocolo Modbus-RTU para leer todos los datos que suministraba a través de un puerto RS-485: max, min, actuales de KW, Hz, A, V, etc.

    Como ves seria fácil implementarlo en la Raspberry Pi.
    Actualmente la uso para la lectura de sensores de temperatura que fabrique (DS18B20) y envió estos valores al PLC y a la pantalla por ethernet (protocolo FINS) y también un "script" para recoger las imágenes y el estatus del tiempo que hace (Yahoo)

    Saludos y felicidades por todas tus horas y compartirlo con nosotros

    ResponderEliminar
    Respuestas
    1. O_O que barbaridá ... no me suena ni la mitad de lo que comentas ...

      Eliminar
    2. Yo me he sentio iguá xD

      Eliminar
    3. hola JeReC haber si habres un post con el tema de adquirir datos mediante rs-485 justo yo también tengo un medidor ion 8500 que usa protocolo modbus RTU y tiene un puerto rs485, GRACIAS....

      Eliminar
  3. Como sois!xD

    Me refería a que la domótica de casa la tengo hecha y programada con un Autómata programable (Omron) y una pantalla (Omron) que es la encargada de la visualización gráfica de todo (luces, persianas, consumos eléctricos, sensores).

    El analizador de redes que os comentaba es de la empresa Circuitor y se conecta a la red eléctrica de la casa, envía los datos a través de un puerto serie (creo que existe en ethernet) mediante un protocolo de consulta (Modbus RTU) muy fácil de implementar tanto en el autómata como en la Raspberry, usando si puerto serie.

    ResponderEliminar
  4. Muy Buen post , acabo de comprar el EnviR para hacer lo mismo que tu.
    lo unico que no he comprado el cable ethernet usb , supongo que será lineal me podias decir que orden tienen los pins para asi poder crear uno yo.
    Muchas Gracias

    ResponderEliminar
    Respuestas
    1. Es un TTL, no es una simple configuración de cables.

      Eliminar
  5. No funciona el enlace al archivo SQL :(

    ResponderEliminar