Ago 012012
 
Artículo Domótica

Como hemos comentado en nuestro anterior artículo de introducción a las redes domóticas EIB/KNX, la conectividad física con el bus puede realizarse de distintas formas, mediante puerto serie, puerto USB o bien mediante red IP.

EIBD es un desarrollo software que presenta a los clientes un interfaz unificado de acceso al bus, implementando internamente los distintos protocolos KNX utilizados por los distintos medios de acceso al bus. Es un componente muy útil para el desarrollo de aplicaciones cliente de acceso y control de la red domótica.

En este artículo vamos a explicar la forma de instalar y hacer uso de este software en un servidor Linux Debian.

1. Instalación de eibd:

Comenzamos por instalar el paquete pthsem que es requerido por eibd, descargándolo de www.auto.tuwien.ac.at:

$ apt-get install build-essential

-------------------------------------
$ cd domotica/EIB
$ wget http://www.auto.tuwien.ac.at/~mkoegler/pth/pthsem_2.0.8.tar.gz
$ tar zxvf pthsem_2.0.8.tar.gz
$ cd pthsem-2.0.8/
$ ./configure
$ make
$ sudo make install

A continuación, realizamos la instalación de eibd, descargando de sourceforge el paquete bcusdk:

$ wget "http://downloads.sourceforge.net/project/bcusdk/bcusdk/bcusdk_0.0.5.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fbcusdk%2F&ts=1334692790&use_mirror=freefr" -O bcusdk_0.0.5.tar.gz
$ tar -zxvf bcusdk_0.0.5.tar.gz
$ cd bcusdk-0.0.5/
$ export LD_LIBRARY_PATH=/usr/local/lib
$ ./configure --enable-onlyeibd --enable-eibnetiptunnel --enable-usb 
         --enable-eibnetipserver --enable-ft12 
$ sudo ln -s /usr/local/lib/libeibclient.so.0 /usr/lib/libeibclient.so.0
$ sudo ln -s /usr/local/lib/libeibclient.so.0 /lib/libeibclient.so.0

Al ejecutar “./configure”, debemos especificar mediante los correspondientes argumentos los interfaces que deseamos que se habiliten para la conectividad con el bus.

Una vez instalado, podemos ver las opciones de que disponemos en la ejecución del programa:

$ eibd --help
Usage: eibd [OPTION...] URL
eibd -- a communication stack for EIB
(C) 2005-2011 Martin Koegler <mkoegler@auto.tuwien.ac.at>
supported URLs are:
ft12:/dev/ttySx
ip:[multicast_addr[:port]]
ipt:router-ip[:dest-port[:src-port[:nat-ip[:data-port]]]]]
iptn:router-ip[:dest-port[:src-port]]
usb:[bus[:device[:config[:interface]]]]

ft12 connects over a serial line without any driver with the FT1.2 Protocol to
a BCU 2

ip connects with the EIBnet/IP Routing protocol over an EIBnet/IP gateway. The
gateway must be so configured, that it routes the necessary addresses

ipt connects with the EIBnet/IP Tunneling protocol over an EIBnet/IP gateway.
The gateway must be so configured, that it routes the necessary addresses

iptn connects with the EIBnet/IP Tunneling protocol over an EIBnet/IP gateway
using the NAT mode

usb connects over a KNX USB interface

  -c, --GroupCache           enable caching of group communication network
                             state
  -d, --daemon[=FILE]        start the programm as daemon, the output will be
                             written to FILE, if the argument present
  -D, --Discovery            enable the EIBnet/IP server to answer discovery
                             and description requests (SEARCH, DESCRIPTION)
  -e, --eibaddr=EIBADDR      set our own EIB-address to EIBADDR (default
                             0.0.1), for drivers, which need an address
  -f, --error=LEVEL          set error level
  -i, --listen-tcp[=PORT]    listen at TCP port PORT (default 6720)
      --no-tunnel-client-queuing   do not assume KNXnet/IP Tunneling bus
                             interface can handle parallel cEMI requests
  -p, --pid-file=FILE        write the PID of the process to FILE
  -R, --Routing              enable EIBnet/IP Routing in the EIBnet/IP server
  -S, --Server[=ip[:port]]   starts the EIBnet/IP server part
  -t, --trace=LEVEL          set trace level
  -T, --Tunnelling           enable EIBnet/IP Tunneling in the EIBnet/IP
                             server
  -u, --listen-local[=FILE]  listen at Unix domain socket FILE (default
                             /tmp/eib)
  -?, --help                 Give this help list
      --usage                Give a short usage message
  -V, --version              Print program version

Mandatory or optional arguments to long options are also mandatory or optional
for any corresponding short options.
$

Como podemos ver, el servidor eibd que hemos configurado permite el acceso al bus mediante BCU2/ft1.2, IP multicast, IP tunneling, IP tunneling en modo NAT, y USB.

Ejecución de eibd con conexión EIBnet/IP

Habiendo preparado previamente una utilidad para capturar los paquetes que se envían por la red IP, arrancamos eibd indicándole que se conecte al bus KNX mediante IP multicast:

$ eibd --trace=5 --listen-local ip:
Prefijo: ft12
Prefijo: ip
Layer 2(01FBBC00,5019291E) Open
Layer 0(01FBBD00,5019291E) Open
Creado socket...
Layer 0(01FBBD00,5019291E) Openend
Layer 2(01FBBC00,5019291E) Opened

 

A continuación desde otra ventana ejecutamos el comando groupswrite para escribir un valor “1” en el dispositivo con dirección “2/3/4”:

$ groupswrite local:/tmp/eib 2/3/4 1

y observamos la traza que escribe en pantalla eibd. En la traza se incluye el telegrama KNX que ha sido enviado al bus:

Layer 2(01FBBC00,50192A09) Send L_Data low from 0.0.1 to 2/3/4 hops: 07 T_DATA_XXX_REQ A_GroupValue_Write (small) 01 
Layer 0(01FBBD00,50192A09) Send(017): 06 10 05 30 00 11 29 00 BC F0 00 01 13 04 01 00 81
Layer 2(01FBBC00,50192A09) Recv L_Data low from 0.0.1 to 2/3/4 hops: 07 T_DATA_XXX_REQ A_GroupValue_Write (small) 01

 

Analizando el paquete (ver la descripción del formato cEMI en  introducción a las redes domóticas EIB/KNX), vemos que comienza con una cabecera de 6 bytes:

    06:   longitud de la cabecera
    10:   versión del protocolo (1.0)
    0530: Descriptor de tipo de servicio: 0530=ROUTING_INDICATION
    0011: Longitud total del paquete: 17 bytes

A continuación viene el message code 0x29 (L_Data.ind) y la longitud de la información adicional (0x00)

Por último está el telegrama KNX:

    BCF0: Bytes de control
    0001: Dirección de origen 0/0/1
    1304: dirección de destino 2/3/4
    01:   Longitud de los datos: 1 byte
    0081: APDU (TPCI+APCI+Datos)

 Ejecución de eibd con conexión a un BCU2/FT1.2

Aunque en nuestro equipo no disponemos de puertos serie, podemos simular un par de puertos serie conectados en “piggyback” mediante el comando linux ‘socat’

$ socat -d -d pty,raw,echo=0 pty,raw,echo=0
2012/08/01 15:14:40 socat[18599] N PTY is /dev/pts/5
2012/08/01 15:14:40 socat[18599] N PTY is /dev/pts/6
2012/08/01 15:14:40 socat[18599] N starting data transfer loop with FDs [3,3] and [5,5]

 

Si a continuación ejecutamos eibd indicándole que se conecte a uno de los puertos serie creados:

$ eibd --trace=5 --listen-local ft12:/dev/pts/5

Vemos que eibd envía un mensaje de inicialización “10 40 40 16”, y continúa enviándolo indefinidamente, porque no recibe como respuesta el mensaje ACK que espera (un único byte 0xE5):

$ eibd --trace=5 --listen-local ft12:/dev/pts/5
Layer 2(013813A0,50193A2E) Open
Layer 2(013813A0,50193A2E) Opened
Layer 2(013813A0,50193A2E) OpenL2
Layer 0(01370C00,50193A2E) Send(004): 10 40 40 16
Layer 0(01370C00,50193A2E) Send(004): 10 40 40 16
Layer 0(01370C00,50193A2E) Send(004): 10 40 40 16
Layer 0(01370C00,50193A2F) Send(004): 10 40 40 16
....

Ahora, escribimos un pequeño programa que escuche en el puerto serie “/dev/pts/6”, y envíe un mensaje ACK “0xE5” cuando reciba un mensaje (socat asegura que lo que se escriba en el puerto 6 aparece como datos de entrada en el puerto 5).

Repitiendo la prueba realizada anteriormente, obtenemos la siguiente respuesta:

$ eibd --trace=5 --listen-local ft12:/dev/pts/5
Layer 2(01C983A0,50193B04) Open
Layer 2(01C983A0,50193B04) Opened
Layer 2(01C983A0,50193B04) OpenL2
Layer 0(01C87C00,50193B04) Send(004): 10 40 40 16
Layer 0(01C87C00,50193B04) Recv(001): E5
Layer 0(01C87C00,50193B04) Send(014): 68 08 08 68 73 A9 1E 12 34 56 78 9A E8 16
Layer 0(01C87C00,50193B04) Recv(001): E5
Layer 0(01C87C00,50193B04) Send(014): 68 08 08 68 53 A9 00 18 34 56 78 0A 20 16
Layer 0(01C87C00,50193B04) Recv(001): E5

En esta ocasión, el mensaje de inicialización “10 40 40 16” obtiene la respuesta esperada, y eibd envía otros dos mensajes, codificados en formato FT1.2/EMI2.

Si ahora ejecutamos el mismo comando groupswrite para enviar una orden al bus:

$ groupswrite local:/tmp/eib 2/3/4 1

obtenemos en la traza de eibd un mensaje adicional, también codificado en FT1.2.

Layer 2(01C983A0,50193FFA) Send L_Data low from 0.0.0 to 6/1/5 hops: 07 T_DATA_XXX_REQ A_GroupValue_Write (small) 01 
Layer 0(01C87C00,50193FFA) Send(016): 68 0A 0A 68 73 11 0C 00 00 31 05 F1 00 81 38 16
Layer 2(01C983A0,50193FFA) Recv L_Data low from 0.0.0 to 6/1/5 hops: 07 T_DATA_XXX_REQ A_GroupValue_Write (small) 01 
Layer 0(01C87C00,50193FFA) Recv(001): E5

 

—-

 Publicado por en 12:34 pm

  8 Respuestas a “Instalación y uso de EIBD”

  1. Buenas tardes y Felicidades por el blog!! Ya era hora de encontar información sobre software libre Knx en castellano.

    He seguido todos tus pasos hasta conseguir iniciar eibd, pero después de tu frase “Habiendo preparado previamente una utilidad para capturar los paquetes que se envían por la red IP, arrancamos eibd indicándole que se conecte al bus KNX mediante IP multicast” me he perdido un poco…

    Tengo un nk2 (www.lingg-Janke.de) y después de un rato de prueba y error y consultas por google no conecto… – Eibd al comando “eibd –help” responde! Así que entiendo que funciona ok. Pero no consigo averiguar el comando para el terminal tipo: eibd -d -D -S -T -i ipt:192.168.1.101:3671 y arrancar.

    ¿Sabes como seguir?

    Saludos

  2. Estimado Jose,

    Por desgracia, el software eibd no es compatible con el dispositivo NK2 que comentas, porque eibd utiliza el protocolo EIBnet/IP, mientras que el NK2 utiliza EIBlib/IP (un protocolo más antiguo).

    Sin embargo, el NK2 viene provisto de un servidor web a través del cual es posible controlar la red domótica utilizando cualquier navegador web que tengas en tu ordenador, o en tu smartphone o tablet.

    Para ello basta con que accedas a la URL “http://192.168.1.101” (suponiendo que previamente has configurado el NK2 con dicha dirección, utilizando el software de configuración NK2Software.zip que viene en un CD que se entrega junto con el dispositivo).

    Espero que esto te ayude, Un saludo

  3. Muchas Gracias “admin” por tu rápida respuesta.

    LLevo 4 años cacharreando con mi nk2 y la verdad… para una primera aproximación al mundo KNX para gente sin experiencia en Domótica ni Programación ¡Es muy potente! Hoy sigo recomendado su uso a quien busca algo BBC (bueno, bonito y barato).

    Pero yo he dedidido cambiar una Zennio z38 que gestiona mi salon por un mini-pc con pantalla táctil, ¿Has oido hablar de la placas raspberry pi?

    Si no puedo usar el nk2 por ser EIBlip/IP, dispongo de 2 dispositivos ABB 8X55.9 conectados a sendos ABB 6121 U-500. Aunque nunca los he usado! El primer conjunto lo tengo conectado en la red, el segundo conjunto en una caja por casa ¿Con estos otros dispositivos sería factible conectar el pc por el puerto serie al bus? He mirado en el pdf del fabricante y buscado por internet pero no sé si son BC1, BC2.. ¿? ¿Cúal seria entonces su comando en el terminal?

    Si tampoco puedo con este último dispositivo ¿Qué me recomendarías comprar?

    Saludos

  4. Hola otra vez Jose,
    Te sugiero que pruebes el comando “eibd ft12:/dev/ttyXX”, en donde debes sustituir ttyXX por el nombre del puerto serie de tu ordenador al que has conectado el 8X55.9. Asegúrate de haber configurado adecuadamente el puerto (baudios, nº bits, bit de parada, paridad, etc…) conforme a las indicaciones del fabricante. Suerte!

  5. Hola buenas;

    En primer lugar muchas gracias por este blog tan fantástico sobre software libre KNX, queria preguntar algunas cuestiones.
    He conseguido la ejecución de eibd con conexión EIBnet/IP, pero en mi proyecto tengo el pc conectado a una instalacion domótica mediante el IProuter KNX y querria controlar my instalación (cosas sencillas de momento), escribiendo a las direcciones de grupo con el “groupswrite”, pero la instalación no me responde, pero en el cazador de tramas me sale todo correcto creo.

    Muchas gracias por la ayuda.

    saludos

    att joan

    • Buenos días Joan,

      Suponiendo que las tramas son correctas, puede haber un problema de comunicación entre el PC y el IP Router:

      Si estás ejecutando el cazador de tramas en el mismo ordenador en el que ejecutas “groupswrite”, puede ocurrir que estés recibiendo las tramas a través del interfaz de loopback, pero en realidad no están siendo transmitidas a la red, debido a que la configuración del firewall del PC no permite el envío de paquetes UDP multicast, o a otros motivos.

      Te sugiero que ejecutes el cazador de tramas en otro ordenador distinto, para verificar que las tramas están siendo enviadas efectivamente a la red.

      Espero que esto te ayude.

      • Hola de nuevo soy Joan, lo que estoy haciendo es conectarme a la raspberry a través del pc por ssh dentro de una misma red local si me conecto a la raspberry por ssh desde dos pc distintos y en uno ejecuto el capturador y en el otro escribo los comandos me funcionara? Lo que intento es que la instalación responda quando yo escribo a una direccion de grupo que lo que hace es encender una luz.
        En otro pc conectado a la misma LAN tengo puesto el ETS4 y con el monitor de grupos, creo que debería ver las tramas pero no las veo, solo veo las que se mandan quando pulso los pulsadores botones (del cuadro de mandos manual).

      • Hola de nuevo, he descubierto mirando el capturador de tramas que las tramas que me devuelve el ip router están incompletas, del campo de datos solo me salen los 2 bytes que corresponderían al numero del canal (channelid) todos los telegramas Recv solo tiene bytes hasta este punto, sin embargo el telegrama send está con todos los bytes correctos pero algunos distintos que ya es lógico, las direcciones ip serán distintas de las del ejemplo del blog, pero el resto de bytes son iguales.

        Muchas gracias y disculpad las molestias.

 Deja un comentario

(requerido)

(requerido)