... 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.
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 ;)
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:
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.shAsegúrate de que tu evento es IN_MODIFY, si no lo es, pon el que más se ajuste.
Impresionante. De nuevo.
ResponderEliminarOOOOOLEEEE!
ResponderEliminarA 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!
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.
EliminarInteresantes como siempre tus posts.
ResponderEliminarNo 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
O_O que barbaridá ... no me suena ni la mitad de lo que comentas ...
EliminarYo me he sentio iguá xD
Eliminarhola 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....
EliminarComo sois!xD
ResponderEliminarMe 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.
Muy Buen post , acabo de comprar el EnviR para hacer lo mismo que tu.
ResponderEliminarlo 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
Es un TTL, no es una simple configuración de cables.
EliminarNo funciona el enlace al archivo SQL :(
ResponderEliminarseguro??? lo acabo de probar ...
Eliminar