Para encontrar algo que me guste, hay que rebuscar mucho

User login

Programación "inteligente" de descargas en la Raspberry Pi

Una de las funciones que le estoy dando a mi Raspberry Pi es la descarga de Torrents. Puedo tener encendido el dispositivo 24 horas al día los 365 días del año sin preocuparme del consumo de electricidad, ruidos o cualquiera de las molestias de usar los ordenadores "normales" para tal función.

Para descargar los torrent, instalé transmission-daemon. Es un cliente torrent muy ligero y además incluye un entorno gráfico web al que se puede acceder desde el navegador de cualquier ordenador o teléfono móvil.

alternate

El problema

El problema con el que me encontré fue la necesidad de programar las horas de descarga. Si descargaba sin límite de velocidad, no podía usar internet de un modo normal desde los otros dispositivos de la casa. transmission-daemon incorpora un pequeño programador muy básico. Gracias a él configuré un límite de subida de 15 kb/s y 100 kb/s de bajada desde las 7 de la mañana hasta las 2 de la madrugada del día siguiente. Horario en el que normalmente suelo usar los ordenadores.

alternate

Pronto esa programación básica demostró ser insuficiente: sólo descargaba sin límite durante 5 horas al día cuando en realidad el tiempo que no necesitaba navegar por internet era mucho mayor. Además, si algún día necesitaba navegar por internet pasadas las 2:00 de la madrugada, primero debía acceder al panel de control de transmission-daemon para limitar manualmente el ancho de banda consumido por el programa.

En resumidas cuentas, la programación no funcionaba porque era demasiado básica y, mucho peor, rígida, no se adaptaba a la aleatoriedad de consumo de internet en casa.

La solución

Gracias a que transmission-daemon permite ser controlado desde la línea de comandos (ésta es una de las grandes ventajas de muchos programas de Linux) la solución del problema se hizo obvia. Los comandos transmission-remote -as y transmission-remote -AS sirven respectivamente para limitar y quitar el límite a las descargas. Así que sólo es necesario detectar si hay ordenadores encendidos en la red doméstica y, en base a ello, aplicar o no los límites a las descargas de la Raspberry Pi.

Para detectar si los ordenadores de la casa están conectados, nada mejor que hacer un ping a su IP. Sería posible hacerlo con las 254 IPs que, normalmente, permitimos todos en nuestras redes domésticas[1]. Parece poco eficiente y, además, en mi casa tengo todos los dispositivos configurados con IP estática.

Explicado el proceso, sólo es necesario automatizarlo para lo que creé un pequeño script en Python que grabé en ~/myscripts con el nombre torrent-autolimit.py:

import os

sTransId = '{-usuario-}:{-clave-}'
dIps = {'    PC 1': '192.168.1.50', '    PC 2': '192.168.1.51', '    PC 3': '192.168.1.52', 'Xbox 360': '192.168.1.53'}

liResponses = []
bComputersOn = False

for sName, sIp in dIps.iteritems():
    iResponse = os.system('ping -q -c 3 ' + sIp + '> /dev/null')

    if iResponse == 0:
        sResponse = 'ON'
        bComputersOn = True
    else:
        sResponse = 'OFF'

    print sName + ' (' + sIp + '): ' + sResponse

if bComputersOn == True:
    os.system('transmission-remote -n ' + sTransId + ' -as')
else:
    os.system('transmission-remote -n ' + sTransId + ' -AS')

En la línea sTransId = '{-usuario-}:{-clave-}' indicaremos los datos de acceso a transmission-daemon. Por defecto, tanto {-usuario-} como {-clave-} deben ser sustituidos por "transmission" (sin las comillas) salvo que hayamos cambiado dicha configuración en transmission-daemon.

En la línea dIps = {' PC 1': '192.168.1.50', ' PC 2': '192.168.1.51', ' PC 3': '192.168.1.52', 'Xbox 360': '192.168.1.53'}, incluyo las IPs de los dispositivos de casa junto con una pequeña descripción de los mismos. Hago que todas las descripciones sean de 8 caracteres para que al llamar manualmente al script todo se vea más bonito.

Los parámetros extra al hacer el ping hacen que sólo envíe 3 paquetes de datos y que no muestre nada en pantalla. De forma análoga, al hacer las llamadas a transmission-remote se añaden parámetros para autentificarnos.

Una vez grabado el script, podemos probarlo sin más que escribir en la consola python ~/myscripts/torrent-autolimit.py. Si todo ha ido bien, veremos en pantalla un listado con los ordenadores que están conectados o no a la red doméstica:

alternate

Sólo queda hacer que la Raspberry Pi ejecute el script automáticamente cada 5 minutos. Para ello, editamos las tareas programadas escribiendo en consola crontab -e y añadiendo la siguiente información al final del archivo:

#   m   h   dom mon dow command
    */5 *   *   *   *   python /home/pi/myscripts/torrent-autolimit.py

Salimos y grabamos los cambios con Ctrl-x, y, Enter. Con esto ya tendremos funcionando nuestro sistema "inteligente" de control de descargas en la Raspberry Pi. Espero que le sea útil a alguien.


  1. 192.168.1.2 hasta 192.168.1.255 porque la 192.168.1.1 corresponde al router.