Un primer borrador, un poco tocho, sería:

Configurar cualquier mando para XBMC/Kodi sobre linux con LIRC.


Introducción.
El objetivo es poder configurar cualquier mando a distancia que tengamos por casa para manejar XBMC. Con esto podemos conseguir:
  • ahorrarnos comprar otro mando que incremente la plaga de cacharros que pueblan el sofá, reutilizando un mando viejo, o mejor todavía:
  • aprovechar algunos botones no usados del mismo mando de la tele o del recepto AV. De forma que con un solo mando manejamos tanto la TV como la XBMC mientras vemos peliculas. Así lo tengo yo y parece que el XBMC esté integrado en la misma TV o receptor. Un anillo para dominarlos a todos...
  • consecuentemente podemos simplemente personalizar algunos botones con cualquier acción de la XBMC a nuestro gusto, dando nueva vida a los rebaños de inútiles botones que colocan los fabricantes en todos los mandos para que parezcan la sala de control de la enterprise (es bien sabido que la calidad de un aparato se conoce por la cantidad de botones que trae).

Por ejemplo: un botón para ir directamente a: peliculas/generos con un solo click. O para apagar el htpc sin pedir confirmación, shutdown directo, o para ponerlo en sleep, etc.

Requisitos:
  • mmm… un mando a distancia! por infrarojos, casi cualquiera vale (con pilas).
  • Un htpc (pc) que tenga lector de infrarojos (IR receiver), muchos ya tienen. O ponerle uno.
  • XBMC. En mi caso corre sobre linux (ubuntu) y es lo que voy a explicar aquí. Para windows o mac la primera parte será diferente pero la configuración de XBMC debería ser igual.
  • paciencia...


Resumen de los pasos:
- A- Comprobar que LIRC funciona y reconoce el mando.
LIRC es el “daemon” (servicio) de linux que se ocupa de leer las señales que llegan por el puerto de infrarojos. Lo primero es comprobar que funciona y que recibe algo cuando le das a un boton del mando.
-B- Buscar o crear el archivo de configuración de tu mando concreto para LIRC.
donde se apareja la señal de cada botón (un numeraco hexadecimal) con un ID del botón. Para muchos mandos la configuración ya está creada. Para el resto, como el mio, se puede crear mediante un programa de 'aprendizaje', que te pide ir dandole a los botoncitos y va creandolo.
-C- Mapearlos las pulsaciones de botones de LIRC con acciones de XBMC. (play, pause, stop, up, down, left, right, select, info...).

Pasos:
Previo: Lo primero sería decidir que mando vamos a usar. Esto no es un tema técnico sino de lógica. Puede ser el mando de algun aparato que esté apagado mientras vemos peliculas o bien usar los botones que no se usan de un aparato que si está en uso y en marcha, como la TV o el reproducto A/V. Pero de forma que no interfieran, logicamente. Por ejemplo, si mapeamos el botón 'power' del mando de la TV con el 'play' de XBMC vamos a tener problemas...

Muchos mandos tienen botones que no se usan o no tienen efecto en modo normal, algunos como el mio tienen justamente botones de play, pause, etc. que son perfectos justo para eso.

- A- Comprobar que LIRC funciona y reconoce el mando.
En muchas distribuciones LIRC ya viene y lo tendrás instalado. Sino tendreis que buscar como instalarlo en vuestra distribución, por ejemplo en las basadas en debian puede instalarse, junto las configuraciones, con el siguiente comando:

Código:
apt-get install ir-keytable lirc
Durante la instalación nos preguntará que mando tenemos, si no aparece el nuestro seleccionar cualquiera.

Una vez instalado LIRC yo empezaría por probar si el sistema recibe las señales de infrarojos de nuestro mando, osea si el hardware está funcionando y el sistema operativo se entera. Para ello y para las configuraciones posteriores necesitaremos averiguar dos cosas importantes:

- El “device” de infrarojos de nuestro sistema: /dev/XXXX (en mi caso /dev/lirc0)
- El driver. Puede ser que con “default” nos funcione. Si no se tendrá que investigar y buscar por ahí.

El device es una especie de directorio virtual donde el hardware deja las señales del puerto infrarojo. En mi caso, un intel NUC con una distribución basada en ubuntu (debian), el device es: /dev/lirc0
Si ya estubiera configurado en vuestro sistema tal vez podais encontrar los valores correctos en: /etc/lirc/hardware.conf

Con esto vamos a ver si el sistema recibe algo por el puerto IR. Pasamos a modo root, detenemos el daemon de lirc en caso de que este activo y volcamos el contenido del device en pantalla:

Código:
	sudo -s                                 
	/etc/init.d/lirc stop 	(para otras distribuciones el comando puede variar)
	cat /dev/lirc0   		(o el device correspondiente de tu sistema)
Entonces si pulsamos cualquier botón del mando (de cualquier mando), deberían aparecer numeracos por el terminal, algo así:

Código:
6s?#~<+<y<+<y<y<y<y<+<y<+<y<+<+<+<+<y<+<y<y<y<y<+V_<y<y<+
<+VV<y<+VVA?)#VH?)#dVV_VpEV_V_V_<+V_VpEVVV<+V_V_VV_V_V_VVV_VV_VVp?V_
pEp?V91#VQ?K????!)#dVV_VV_V_V_V_VV_VpEVVVVV_VV_V_V_pEVVV_V_Vp?VhV_V_Vp'?
C#VH?u?)#d<+<y<+V_V_<y<yVV_<+V_p?
<+VVV_VVV_V_V_VVV_V_V_VVVV_V_Vp1#VQ??N)#dV_V_pEpEpEpEV_VpEVVhVVp?VV_VVV_VpEV
_VVpEV_VV_VVpEVJ?)#V@?^C
Cortamos con CTRL-C.

Eso significa que el puerto infrarojos funciona y recibe la señal del mando. Los carácteres anteriores son codificaciones “en crudo” de las pulsaciones (no son un script en perl, aunque lo parezcan al ojo inexperto).
Si esto no funciona, mal vamos. O no hay puerto de infrarojos o el sistema no lo ha reconocido, o ambos dos. Lo mejor sería buscar informacion sobre la instalacion de LIRC en tu distribucion. Por ejemplo para ubutu: https://help.ubuntu.com/community/LIRC . Y para tu hardware concreto.
Y que no te pase nada...

-B- Buscar o crear la configuración para LIRC.
Si lo anterior funciona lo siguiente es que LIRC reconozca nuestro modelo de mando.
Primero revisamos la configuración de LIRC, echamos un vistazo al archivo: /etc/lirc/hardware.conf
Ahí debería estar especificado el device, el driver y otras cosas. Si no lo está lo completais o directamente lo borrais todo y escribís lo siguiente:

Código:
REMOTE_DRIVER="default"
REMOTE_DEVICE="/dev/lirc0"
REMOTE_SOCKET="/var/run/lirc/lircd"
REMOTE_LIRCD_CONF="/etc/lircd/lircd.conf"
REMOTE_LIRCD_ARGS=""
START_LIRCD="true"
LOAD_MODULES="true"
LIRCMD_CONF=""
FORCE_NONINTERACTIVE_RECONFIGURATION="false"
START_LIRCMD=""
Ajustando el driver y el device según vuestro sistema. De nuevo para otras distribuciones podría ser diferente, tendreis que investigar por google.
Y aseguraos que el archivo de configuración está en el lugar especificado: /etc/lircd/lircd.conf
Con eso debería bastar y el lirc arrancar y funcionar. Si no tendreis que buscar por google según vuestro modelo de HTPC y distribución, por ejemplo buscad en google: «lirc, redhat, hp-viejuno-XYZ»

Si tenemos suerte nuestro mando igual es uno de los que viene configurado por defecto.Podemos comprobarlo con el programa para testear LIRC, el irw, de la siguiente manera.
Pasamos a root, si no lo estamos ya, arrancamos el daemon LIRC de nuevo y lanzamos el irw:

Código:
sudo -s
/etc/init.d/lirc start
irw
Ahora si pulsamos teclas del mando deberían aparecer las pulsaciones en el terminal, algo así:

Código:
000000005ea1b946 00 Up MyRemote
000000005ea1b946 01 Up MyRemote
000000005ea17b84 00 Enter MyRemote
000000005ea17b84 01 Enter MyRemote
00000000fe8016e9 00 Play MyRemote
00000000fe8016e9 01 Play MyRemote
00000000fe80e619 00 Pause MyRemote
00000000fe80e619 01 Pause MyRemote
Cortamos con CTRL-C.

Si no sale nada por pantalla es normal, significa que vuestro mando no viene configurado por defecto. En caso de que si que funcione, podeis pasar a la parte -C-.
Sino, pues hay que buscar o crear la configuración de vuestro mando en concreto, como explicamos a continuación.
Lo primero sería buscar si aparece tu mando, por fabricante y modelo aquí: LIRC - Linux Infrared Remote Control (o un modelo similar).
Si está nos bajamos el conf, lo copiamos en /etc/lirc/ y lo renombramos como: lircd.conf
Reiniciamos el daemon:
Código:
/etc/init.d/lirc restart
y volvemos a probar con irw como en el paso anterior. Si funciona pasamos a -C-

Si no está nuestro mando es que nadie lo ha mapeado aun, tendrás la oportunidad de ser el primero! Usaremos un programa para que “aprenda” nuestras teclas:

Código:
cd /etc/lircd/
/etc/init.d/lirc stop
irrecord --driver=default --device=/dev/lirc0 --disable-namespace MyRemote    (poniendo el driver y device correctos)
Este programa nos pedirá que vayamos pulsando teclas aleatoriamente y sin parar durante un rato, para identificar parametros generales del mando. Una vez hecho esto nos pedirá que pongamos el nombre de una tecla, escribimos por ejemplo “play”,le damos al enter y nos dirá que dejemos pulsada la tecla “play” un segundo o dos. Luego lo mismo con otra tecla y asi sucesivamente hasta que registremos todas las teclas que necesitemos.

Cuando acabemos nos dejará un archivo: MyRemote.conf que tendremos que renombrar a lircd.conf Todo esto en el directorio /etc/lircd/ en el que estamos.
Reiniciamos el daemon y volvemos a probar con irw. Ahora al pulsar las teclas que hemos registrado deberían aparecer en pantalla con los nombres que les hemos puesto.

-C- Mapear las pulsaciones registradas en LIRC con acciones de XBMC.
Para ello salimos de root y vamos al directorio ~/.xbmc/userdata/ de la home de nuestro usuario. Allí necesitaremos tener un archivo Lircmap.xml . Si no está lo copiamos de /usr/share/xbmc/system/
Antes de nada volvemos a echar un vistazo al archivo: /etc/lirc/lircd.conf Debería ser algo así:

Código:
begin remote
                      name  MyRemote
                      bits           32
                      flags SPACE_ENC|CONST_LENGTH
                      eps            30
                      aeps          100
                      header       8984  4466
                      one           578  1650
                      zero          578   548
                      ptrail        579
                      repeat       8986  2228
                      gap          107554
                      toggle_bit_mask 0x0

                          begin codes
                              Play                     0xFE8016E9
                              Pause                    0xFE80E619
                              Stop                     0xFE809669
			    ... (mas codigos)
                          end codes
end remote
Nos fijamos en el nombre del mando en “name”, que si no lo hemos cambiado será: MyRemote Y en la sección de los codigos estarán los que hemos mapeado con los nombres que les hayamos puesto.

A continuación editamos el archivo Lircmap.xml para echar un vistazo. Después de algunos comentarios y morralla vemos algo como lo siguiente:

Código:
<lircmap>
      <remote device="mceusb">
             <play>Play</play>
              <pause>Pause</pause>
              <stop>Stop</stop>
		...
El nombre del device en este caso es “mceusb”, un mando tipo MCE que supongo que no es el nuestro. Lo que tenemos que hacer es cambiarle el nombre o bien crear una seccion igual con el nombre del nuestro, que es el que aparece en /etc/lirc/lircd.conf y que si no lo hemos cambiado sera “MyRemote”. Lo ajustamos de forma que tengamos una sección que empieze asi:

Código:
<lircmap>
       <remote device="MyRemote">
                <play>Play</play>
                <pause>Pause</pause>
                <stop>Stop</stop>
		...
Y las siguientes lineas definen las acciones de XBMC contra las pulsaciones definidas en /etc/lirc/lircd.conf (ojo con las mayusculas).
Las de arriba son evidentes, la que esta en mayusculas en medio es la pulsación definida en /etc/lirc/lircd.conf.

Por ejemplo, yo tengo definido que la tecla “Display” de mi mando me muestre la info de la película en XBMC.
Con lo cual en /etc/lirc/lircd.conf tengo una linea en la sección de los códigos:

Código:
Display                  0xFE8006F9
Y en el Lircmap.xml tengo otra:

Código:
<info>Display</info>
En este caso “Display” es el botón mapeado en LIRC y “info” es la acción de XBMC que hemos mapeado.

Y así con todos los botones que hayamos definido. También podemos cambiar acciones por defecto para ajustarlas a nuestras preferencias. O bien eliminar mapeos de botones para que no interfieran con el aparato. Solo hemos de asegurarnos que los nombres coinciden en ambos archivos, no hay duplicados y todo cuadra.

Arrancamos el daemon: /etc/init.d/lirc start , reiniciamos XBMC y ya debería obedecer a nuestro mando! Voilà! o como dicen los franceses: bualá.
Con esto ya estaría, solo quedaría eventualmente afinar la configuración de los botones como realmente nos vaya mejor según probemos.

El resto de secciones <remote ...> del Lircmap.xml definen otros mandos, nos los podemos cargar todos menos el nuestro, o dejarlos ahi que tampoco molestan.
La mayoria de acciones disponibles las podemos ver en las otras secciones que nos acabamos de cargar. O buscarlas por ahí.

De hecho las acciones realmente se definen en otro sitio, en un archivo remote.xml que podemos colocar en la subcarpeta “keymaps”. Esto solo es necesario si queremos definir acciones mas avanzadas que no están definidas por defecto. Por ejemplo podemos definir acciones como:

Código:
<mymusic>XBMC.ActivateWindow(MyMusic)</mymusic>
<power>ActivateWindow(shutdownmenu)</power>
<clear>XBMC.ActivateWindow(Weather)</clear>
etc.
Pero la mayoría de las habituales ya vienen definidas. Los diferentes keymaps para ver que acciones hay o copiarnoslos al directorio ~/.xbmc/userdata/keymaps/ del usuario podemos encontrarlos en: /usr/share/xbmc/system/keymaps/

Espero que sirva de ayuda, si alguien consigue aclarase con el follón de explicación. De hecho las indicaciones están muy basadas en mi configuración concreta que es la única que he podido probar. En otras máquinas o distribuciones de linux el tema puede variar bastante, pero al menos espero que esto ayude a entender un poco el montaje general.