raspberry pi domotica razberry z-wave

Domotica, Asterisk, Smart Metering y el Internet de las Cosas

Dado que este blog está cogiendo ciertos tintes de orientación del Sistema Asterisk, para entornos caseros o en el mejor de os casos, las pequeñas y medianas empresas, he pensado que sería bastante interesante empezar a introducir terceras aplicaciones relacionadas al mundo de la domotica, automatización de sistemas en casa (y en la oficina), y todo gestionado más allá de la tecnología software convencional como podrían ser las aplicaciones de los Smartphones y los entornos web.

domotica asterisk

Todo mi interés ha surgido a raíz del Tarifazo eléctrico acontecido recientemente en España, y el incremento de la factura de la luz en un porcentaje significativo (Sumado a los altos consumos de Inverno relativos al uso de sistemas de calefacción). Esto me ha llevado a investigar acerca de alguna posible opción domotica para controlar el consumo eléctrico con los populares Smart Meters (medidores Inteligentes de consumo). A esta práctica se le llama “Smart Metering” y en el entorno Demótico está totalmente en Auge.

Soluciones de Smart Metering para nuestro futuro sistema de Domotica

Después de revisar miles de opciones bastante costosas como IPDomo Energy Socket Meter, uno de los pocos dispositivos capaz de medir el consumo de un dispositivo en concreto y enviar la información vía Wifi (a un precio excesivo si cabe >180 euros), y la alternativa, control desde el Cuadro Eléctrico del consumo integral del domicilio, con E2 Efergy, empecé a tantear otras opciones basadas en protocolos propietarios de comunicación tales como la solución de ClienSol, EnviR, unido al módulo de conexión a internet, más un Enchufe con Sensor Inalámbrico por un total de cerca de 180 euros también, siendo toda la comunicación propietaria, y con montones de dispositivos de por medio).

En este momento descubrí los protocolos de comunicación “Inalámbricos” para la domotica (que hasta la fecha solo conocía los cableados como X10), y se presentó ante mí una de las apuestas fuertes, Zigbee, con el sistema Enistic Single Socket Smart Meter, que también tenía un alto coste (módulos más recibidor, etc…). Este fue el momento que estaba a punto de desechar la idea, porque consideraba que montar soluciones de estas características eran excesivamente costosas. Las aplicaciones con sistemas “Open Source” como Arduino eran totalmente rudimentarias, y muy poco fiables, lo que hizo en mí que las desechase prácticamente desde los inicios.

Pero de pronto me topé con una presentación del último evento Voip2Day 2013 sobre domotica, al que no pude Asistir, de Alberto Sagredo:

En esta presentación curiosamente, hace referencia a Z-Wave como otro estándar de comunicaciones para domotica, el cual está siendo ampliamente aceptado, y dispone de una cantidad de dispositivos increíblemente grande. Y concrétamente hubieron dos dispositivos que me llamaron especialmente la atención: Fibaro Wall Plug y RazBerry, y concrétamente este último porque se considera una placa para Raspberry Pi que permitiría una integración con un sistema como Asterisk en el mismo dispositivo y servir como servidor de comunicación para la intercomunicación con este dispositivo de Z-Wave.ME

De momento he realizado el pedido de estos dos dispositivos de domotica para empezar a probarlos. Tal y como ha hecho Alberto Sagredo en su presentación (que en su caso aplica los casos de uso entre Asterisk y un Controlador Z-Wave de la marca Zipato el modelo ZipaBox cuyo coste de 200 euros no es desdeñable, dentro de la franja de otros controladores Entry-Level como Vera Lite Smart Home Controller

Asterisk con Websockets para WebRTC y probando SIPML5

ATENCIÓN: Este artículo ya no es útil puesto que Chrome en su versión 35 en adelante ha pasado su sistema de encriptación para WebRTC de SDES a SRTP/DTLS como estaba planificado desde principios de Enero 2014. Este articulo definía el metodo para montar un sistema Asterisk basado en este sistema. Cuando salga la resolución definitiva en Asterisk creare otro articulo para explicar como configurar con Asterisk este sistema

Volviendo a la carga con Artículos sobre Asterisk, voy a explicar algo que aunque ya está algo visto, ha sido parte de mi experiencia y como viendo haciendo hasta ahora intento explicarlo con el mayor número de detalles

Hay que considerar que en este momento estoy trabajando con la versión CERT de Asterisk concretamente la versión 11.6-cert1

webrtc asterisk

Preparando la instalación del Sistema Asterisk para WebRTC

En primer lugar, sería conveniente tener soporte para el códec OPUS que es una de las claves que WebRTC utilizan de forma nativa y quizá sea de las principales ventajas de su uso.

Si no tenemos autoconf necesitamos instalarlo y también hará falta libtool y pkg-config

# apt-get install autoconf libtool pkg-config

ATENCIÓN (Con Asterisk  >11.6) si compilamos con soporte OPUS habrá un problema de AUDIO (Issue en Git de Meetecho: https://github.com/meetecho/asterisk-opus/issues/6). Por eso este paso de instalación de Opus en este tipo de versiones, seria conveniente saltárselo de momento a partir de aquí:

Para ello lo podemos descargar desde el repositorio GIT de este proyecto. Tenemos que descargar este fichero en el directorio raíz donde esta el código de Asterisk listo para ser compilado.

#wget https://raw.github.com/meetecho/asterisk-opus/master/asterisk_opus+vp8.diff

Desde ahí lanzamos el parche

# patch -p1 -u < asterisk_opus+vp8.diff

Y a continuación preparamos el sistema para que pueda instalarse el códec OPUS:

# ./bootstrap.sh

En mi caso, trabajando con Ubuntu Server 12.04, me hace falta instalar la librería Opus en el sistema, que no viene en los repositorios de Ubuntu por defecto:

# apt-get install python-software-properties
# add-apt-repository ppa:ubuntu-sdk-team/ppa
# apt-get update
# apt-get install libopus-dev

Después de instalar el códec OPUS pasamos a instalar el resto de las dependencias para su funcionamiento

También nos hará falta la librería libsrtp0-dev para gestionar la encriptación de las conexiones WebRTC y las librerias de Universally Unique Identifier, uuid-dev (este último es específico la versión 11 de Asterisk y su no instalación provocaría problemas en la comunicación con ICE, y aunque la llamada entraría en el sistema, no se escucharía nada por una cuestión de RTP) . Podemos instalarlas directamente desde los repositorios del sistema:

# apt-get install libsrtp0-dev libsrtp0 uuid-dev

Con todo preparado realizamos la instalación de Asterisk

# ./configure --with-crypto --with-ssl --with-srtp=/usr/lib

Finalmente seleccionamos el códec Opus y Formato VP8 con make menuselect (Codec Translators -> códec_opus y Format Interpreters -> format_vp8)

Por otro lado, para instalar nuestro sistema websockets en Asterisk primero deberemos instalar el Recurso HTTP Websocket. Esto se realiza durante la instalación de Asterisk (make menuselect) en la sección Resource Modules, y cuyo nombre es res_http_websocket

También se recomienda por cuestiones de calidad, seleccionar los paquetes musicales tanto los mensajes de Asterisk como los de Music On Hold en formato SLN16 (CORE-SOUNDS-ES-SLN16, MOH-OPSOUND-SLN16 y EXTRA-SOUNDS-EN-SLN16)

Y ya podemos compilar Asterisk con todo el soporte necesario

# make && make install

Configurando Asterisk y Websockets

A partir de aquí ya tenemos el sistema preparado para ser configurado simplemente. En primer lugar configurador el servidor HTTP de Asterisk desde el fichero http.conf

[general]
enabled=yes
bindaddr=0.0.0.0
bindport=8088

A continuación pasamos a configurar el soporte ICE y STUN en el fichero RTP.conf para ello añadimos las líneas dentro de la etiqueta [general]

icesupport=true
stunaddr=stun.l.google.com:19302

Finalmente pasamos a configurar un peer SIP para que soporte la comunicación con WebSockets. En el fichero sip.conf dentro de la etiqueta [general]:

allowguest=no
udpbindaddr=0.0.0.0:5060

Y creamos una extensión con los siguientes parámetros

[extension1]
secret=miclavesecreta
transport=udp,wss,ws
encryption=yes
avpf=yes
icesupport=yes
directmedia=no
host=dynamic
nat=force_rport,comedia
qualify=yes // opcional
type=friend
context=phones

Con todo esto solo necesitaremos configurar en nuestro servidor Web un softphone basado en WebRTC y que soporte WebSockets (esto es opcional, si tenemos publicado el servidor SIP el webphone RTC se conectaría directamente, los websockets serían utiles en caso que definieramos en el sip.conf un nombre al dominio (con la propiedad realm) y conectáramos a este realm a traves de una conexión con Websockets (otra de las claves principales de WebRTC junto al Codec OPUS). Por ejemplo,supongamos la dirección pública de nuestro servidor es 123.123.123.123 y hemos abierto el puerto 8088 (del servidor HTTP de Asterisk para habilitar los Websockets). Configuramos en el fichero sip.conf,

[general]
realm=10000horas.com

Ahora en el softphone configuramos (por ejemplo SIPML5, aunque pongo otras opciones más adelante):

Private Entity: la extensión usada, en este caso extension1
Publc Entity: sip:extension1@10000horas.com
Password: la_password_de_la_extension
Realm: 10000horas.com

Y en el apartado “Expert” debemos configurar la dirección a la que apunta el Websocket. Usando comunicación Websockets sin encriptar:

Websocket Server URL: ws://123.123.123.123:8088/ws

Así estableceríamos la conexión en vez de directamente al servidor SIP, lo haríamos gracias al servidor WebSocket, lo que es bastante provechoso y podríamos llegar a incrementar la seguridad del sistema (considerando que tener el Puerto 5060 a libre albedrío es peligroso, aunque no todos opinan lo mismo)

Disponemos de varias opciones entre las más populares SIPML5 y JsSIP. De todas formas si tenemos el servidor delante de un firewall o hemos gestionado los puertos correspondientes podríamos hacer una prueba desde cada uno de los sistemas:

SIPML5: http://sipml5.org/call.htm
JsSIP: http://tryit.jssip.net/

Espero que os haya servido, os recomiendo el cliente de escritorio Phoner Lite (http://phonerlite.de/index_en.htm) si queréis hacer pruebas ya que es de los pocos Softphones que dispone del códec OPUS por defecto.