Es curioso porque cuando compré mi placa Razberry Z-Wave tenía ciertas dudas si conseguiría que funcionase algo con todo esto de la Domotica. Como comentaba en el anterior artículo, todo mi interés surgió cuando me dispuse a investigar sobre soluciones de Smart Metering y vi que los productos completos en el mercado eran excesivamente caros para mi gusto. De pronto, me encontré con los Fibaro Wall-Plugs: Ese tipo de medidores que llaman a la vista por ser excepcionalmente pequeños, y que al parecer, cumplían el objetivo! Con eso solo faltaba el controlador Z-Wave, y por menos de 200 euros, bastante difícil bajarse del burro: Hasta que localice el Razberry Z-Wave 2 por 1: Una interfaz con una API REST y realizaba la función al milímetro. Pero como suelen decir: las gangas no existen, y necesitaba comprobarlo con mis propios ojos, así que hice el pedido (que por cierto, sorprendentemente llego en poco más de un día a través de la tienda online zwave.es y yo esperaba que esa tarjeta Razberry tardará semanas, o incluso meses por ser relativa como popular). Y con todo el material en casa, me dispuse a montar el sistema
Primero el objetivo: Saber cuánto consumen los distintos dispositivos eléctricos/electrónica de mi casa. Quizá en un futuro gracias a la domotica, sería interesante tener una gráfica de consumo y tal, pero creo que es sería más interesante con un dispositivo que se coloca en el cuadro general y mide el consumo general de toda la casa. Pero para un dispositivo en concreto creo que realmente la gracia está en saber cuánto consume.
Por ejemplo: Ponemos el controlador en la lavadora, ponemos el programa clásico de lavado y podemos observar cuanto ha consumido (a pesar de las especificaciones del fabricante). Ahora mismo estoy comprobando el consumo de los emisores térmicos de mi casa, que tienen fama de «ahorro energético» pero tengo la sensación que no es cierto del todo. Esta es una de las bondades de la domotica.
Configurando la interfaz Domotica del Razberry en nuestra Raspberry Pi
Ahora manos a la obra. En primer lugar vamos a configurar el sistema. Para ello nos hace falta tener una Raspberry Pi a la que conectar la placa Razberry Z-Wave (encima de los 10-pines más pegados a la ranura de la tarjeta SD, aunque una imagen vale más que mil palabras)
Si ya tenemos Rasbian instalado (versión wheezy en el momento de escribir este artículo más convenientemente), simplemente tendremos que ejecutar el siguiente comando:
wget -q -O - razberry.z-wave.me/install | sudo bash
Con esto quedan instalados los drivers para la Razberry, y el software al que se accede vía web. Quizá necesario reiniciar el sistema para que el sistema operativo reconozca la tarjeta una vez instalado el driver. A partir de aquí ya podemos acceder a la interfaz web:
http://ip_raspberry_pi:8083/expert/
Ahora tenemos que configurar nuestro Fibaro Wall Plug en el sistema de domotica Razberry Z-Wave. Para ello simplemente conectamos el Wall-Plug al dispositivo eléctrico y la corriente como es lógico, y debería encenderse ya el LED en un color indicando el consumo del dispositivo en cuestión (si está apagado, lo más probable es que los leds estén en un azul muy claro). Simplemente con esta acción, el Fibaro Wall-Plug estará preparado para sincronizar con nuestro Razberry. Para ello desde la interfaz web vamos a Network -> Network Management -> (Re)include device y si todo va bien, debería emparejarse sin problemas (en teoría la señal Z-Wave es de aproximadamente unos 20 metros, por eso si no detecta, es que a lo mejor está demasiado lejos, de todas formas el Fibaro Wall Plug tiene un botón en la parte inferior que permite realizar una sincronización forzada, leer el manual de uso, pero a mi siempre me lo ha detectado a la primera)
En el panel de control Web Razberry Z-Wave vamos a Devices configuration y en la parte inferior derecha pulsamos en Expert mode. En la lista de dispositivos en la parte izquierda debería aparecer nuestro Fibaro Wall-Plug, si picamos sobre el y vamos a la parte inferior de la lista de opciones deberíamos ver un menú desplegable llamado Advanced Actions. Dentro pulsamos en Show Interview Results. Si pulsamos en SensorMultiLevel podemos ver todos los datos necesarios para configurar a continuación un acceso a la API de Razberry Z-Wave fundamental para montar nuestro pequeño programa casero para extraer información del sensor. Esto es aplicable a todos los dispositivos que emparejemos con nuestro dispositivo
En mi ejemplo si nos damos cuenta, el acceso al Sensor Multi Nivel de la Razberry, se realiza desde devices[2].instances[0].commandClasses[49].data[4].val (en caso de data hay para elegir el 0 y el 4, como quiero sacar el dato en val que es el consumo en Vatios (W) en el momento concreto, pues elijo el 4 y la propiedad «val»).
Para confirmar que todo va bien, podemos acceder a este valor a través de la API de Razberry a través de la dirección (con la propiedad value al final para que nos devuelva el valor)
http://ip_raspberry_pi:8083/ZWaveAPI/Run/devices[2].instances[0].commandClasses[49].data[4].val.value
Si vemos un valor significa que todo va bien (es posible que los valores cambien de dispositivo a dispositivo, por eso he indicado como yo he llegado a estos valores específicamente)
Programación utilizando la API de Razberry y el Fibaro Wall Plug
Ahora mi objetivo es crear un script en PHP que vaya metiendo en una base de datos cada 5 minutos este valor a través de la librería cURL. Dado que la Raspberry Pi no está para trotes, he decidido usar la base de datos SQLite. Creamos la base de datos con el nombre que queramos que es un fichero al final de cuentas, si ya tenemos SQLite instalado y un servidor web con la extensión de PHP (en mi caso puse apache2 como servidor web que aunque es pesado lo conozco mejor, aunque quizá sería más recomendable lighthttp) podemos crear la base de datos con el comando:
# sqlite3 razberry.db
Luego desde la interfaz sqlite3 podemos crear la tabla por ejemplo «plug» con los comandos clásicos de SQL. Nos van a hacer falta unos 4 campos:
- Un identificador único INTEGER llamado id con autoincremento (no es fundamental, pero nunca está de mas)
- Un parámetro tipo DATETIME llamémosle fecha
- Un parámetro tipo REAL llamado valor
- Un parámetro tipo INTEGER llamado disp. (tampoco es fundamental, pero es práctico para llevar un control de sucesivos dispositivos específicos y no mezclar datos, aparte que me va a servir para simplificar la programación al máximo a efectos explicativos)
El script en PHP es el siguiente, llamémosle /home/pi/consumo.php
#!/usr/bin/php
<?php
if (!function_exists('curl_init')){
die('Sorry cURL is not installed!');
}
$url = "http://ip_raspberry_pi:8083/ZWaveAPI/Run/devices[2].instances[0].commandClasses[49].data[4].val.value";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
class MiBD extends SQLite3{
function __construct()
{ $this->open('/var/www/razberry.db'); }
}
$bd = new MiBD();
$watios = curl_exec($ch);
$bd->exec("INSERT INTO plug (fecha,valor,disp) VALUES (datetime('now'),$watios,1)");
curl_close($ch);
?>
De aquí solo ver, que hacemos una llamada a la API con cURL para sacar el dato de consumo, y luego insertamos el datos en la tabla junto a la fecha del momento y marcamos el dispositivo número 1 (en este caso el primer dispositivo electrónico que vayamos a medir, luego si cambiamos de sitio el enchufe para domotica Fibaro Wall-plug podemos poner el número 2, 3 y así sucesivamente)
Ahora necesitamos un script para que corra este script en PHP cada 5 segundos, por ejemplo /home/pi/consumo.sh:
#!/bin/sh
(sleep 5 && /home/pi/consumo.php) &
(sleep 10 && /home/pi/consumo.php) &
(sleep 15 && /home/pi/consumo.php) &
(sleep 20 && /home/pi/consumo.php) &
(sleep 25 && /home/pi/consumo.php) &
(sleep 30 && /home/pi/consumo.php) &
(sleep 35 && /home/pi/consumo.php) &
(sleep 40 && /home/pi/consumo.php) &
(sleep 45 && /home/pi/consumo.php) &
(sleep 50 && /home/pi/consumo.php) &
(sleep 55 && /home/pi/consumo.php) &
(sleep 60 && /home/pi/consumo.php)
Lo admito: La elegancia programando no es lo mío, no me acordaba muy bien cómo eran los parámetros en Bash y prefería invertir el tiempo en esta entrada, que en dejarlo todo óptimo J
Finalmente vamos a poner este script con una línea en /etc/crontab:
* * * * * root /home/pi/plug.sh
Y ya debería funcionar cada 5 segundos, almacenando los datos de consumo en esos intervalos de tiempo.
Por último y para poner la guinda del pastel, si instalamos el servidor web Apache o LightHTTP como indicaba antes, podríamos tener un básico panel de control en PHP para saber la información que nos reporta esta base de datos (por ejemplo en /var/www/reportes.php)
<?php
class MiBD extends SQLite3
{
function __construct() { $this->open('/var/www/razberry.db'); }
}
$bd = new MiBD();
$resultado = $bd->query("SELECT AVG(valor),COUNT(valor) FROM plug WHERE (fecha > datetime('now','-24 hours')) AND (fecha < datetime('now')) AND (disp = 1)");
$res = $resultado->fetchArray();
$kwh = 0.162; // El coste el KWH de vuestra compañía de Luz
echo "Potencia Media en las ultimas 24 horas: ".$res[0]." W";
echo "<br/> Numero Registros: ".$res[1];
$coste = $res[0]/1000 * $kwh * 24 * 30;
echo "<br/> Coste Mensual: ".$coste." euros";
if (!function_exists('curl_init')){
die('Sorry cURL is not installed!');
}
$url = "http://ip_de_raspberry:8083/ZWaveAPI/Run/devices[2].instances[0].commandClasses[49].data[4].val.value";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$watios = curl_exec($ch);
echo "<br/> Consumo Actual: ".$watios." W";
?>
Y ahora me entero que mi emisor térmico efectivamente, no gasta tanto como creía:
Potencia Media en las últimas 24 horas: 150.13031858033 W
Numero Registros: 17273
Coste Mensual: 17.51120035921 euros
Consumo Actual: 282.6000128 W
Espero que os sirva de provecho esta guía para tener un pequeño Z-Wave casero. En un futuro, intentare adquirir algún producto adicional Z-Wave (un sensor de movimiento y una alarma por ejemplo), y planteare «fusionar» el mundo de la Domotica con Asterisk
evidentemente el raz trabaja con tecnologia zigbee, te pregunto que solucion podriamos tener si tenemos una red de sensores desplegado en una edifición amplia > 20 mts, colocariamos una red de raspebbey con los respectivos adaptadores zwave pero como integrariamos para consolidar solo un controlador zwave