Generando informes de velocidad ADSL automáticamente

método para calcular automáticamente nuestra velocidad de conexión a internet

¿Te gustaría poder medir cada cierto tiempo y de forma programada la velocidad de tu conexión a Internet?

¿Te gustaría recibir por email un informe de las distintas pruebas de velocidad realizadas?

¿Qué tal contar con gráficos de las distintas velocidades (medias, máximas y mínimas) de la última semana o mes?

Suena bien ¿verdad? Pues déjame contarte algo más…

Génesis de la idea

Durante estas navidades experimenté problemas con la conexión a Internet que tengo contratada con un proveedor local (actualmente las “grandes” no ofrecen fibra óptica en mi localidad y es un gustazo levantar el teléfono y poder llamar tanto a los comerciales como a los técnicos por su nombre ¿no os parece?).

Total que entre prueba y prueba estaba continuamente realizando test de velocidad para conocer realmente qué cantidad de los 50 megas que tengo actualmente contratados con éllos me llegaba.

Pero claro, resultaba algo “cansado” (y aburrido) tener que hacerlo manualmente y, como perezoso informático que soy con tendencia a evitar los trabajo mecánicos y repetitivos (y éste lo era) decidí crear un script (como suelo decir: “lo que no se automatiza… no se hace”) con el que dar algo de sentido a la NAS que tengo (cual perrito faldero esperando que le tire un “hueso” con el que jugar echado junto a mi ordenador de trabajo) aburrida la mayor parte del tiempo (la Raspberry PI podría servir igual pero la NAS ya está comiendo electricidad sin “ganársela” 😉 )

¿Os seduce el plan?

El script “pythonero”

Ni corto ni perezoso, utilizando el paquete speedtest-cli y alguna que otra hora suelta he logrado montar el siguiente programita que resuelve todas mis cuitas y que, con la apropiada tarea de cron, me anota (en una base de datos sqlite)

  1. fecha y hora de la medición
  2. velocidad de subida y de bajada
  3. latencia de la conexión (acá el ping)
  4. servidor contra el que se ha realizado la medición

Pendiente quedan cantidad de ideas y mejoras que me gustaría ir abordando pero he optado por darlo a conocer (y publicar su código) por varios motivos:

  1. Hay gente que ya cuenta con soluciones similares (entre ellos destacar al amigo Martí @martipuig91 que tiene algo similar montado desde hace tiempo en su RPi y que gentilmente compartió conmigo por si me resultaba de utilidad… por desgracia me enteré cuando ya tenía implementadas las anotaciones en SQLite. “Culpa” mía por no buscar en lugar de ponerme a programar jeje)
  2. Igual que ocurrió con la edición de las respuestas de los formularios de Google Drive vuestra opinión y sugerencias ayudarían a mejorar el proyecto
  3. Subiendo el código a GitHub igual aprovechamos sinergias y entre todos logramos hacer algo que realmente merezca la pena.

Work in progress…

No esperes grandes interfaces gráficas (ni pequeñas… no las tiene 😅 ¿las necesita?), la idea es sacar algo funcional (que puedas empezar a usar ya) e ir mejorándolo bajo necesidad (principio de Pareto) según se vaya detectando (si echas de menos algo que consideras imprescindible para que te sirva para algo el script, ya estás “tardando” en pedir que se incluya)

No puedo resistirme a enlazar el artículo que publiqué sobre la visión de Linus Torvalds sobre cómo debería ser el diseño de software, ¡grande Linus!

Me he centrado en publicar algo funcional (aunque esté incompleto), actualmente

  1. Anota las distintar mediciones de velocidad
  2. Sabe crear gráficas: he añadido una de velocidades (son sólo de bajada y de la última semana) como prueba de concepto y guía. En la cabeza tengo otras y mucho más útiles… tiempo al tiempo (y a las necesidades que se detecten)
  3. Gestiona parámetros de entrada para poder indicar (desde cron) qué queremos hacer (realizar una medición de velocidad, generar una gráfica, obtener información de los parámetros que admite, …)
  4. Utiliza ficheros json de configuración: actualmente el “entorno” (Desarrollo, Pruebas, Explotación) en el que se ejecuta el script pero se irá abriendo a otras opciones según necesidades.

representar gráficamente la velocidad de conexión a internet

El código del proyecto

Si estás deseando probar el script (o las ideas de mejora fluyen en ti) sólo tienes que pasarte por el repositorio de GitHub tanto en:

  • Código para descargar, realizar “forks” como para aportar modificaciones (el día que alguien haga alguna le dedico un “post” en el blog 😅)
  • Tareas para proponer mejoras, notificar fallos, contribuir con comentarios y sugerencias a las tareas existentes, … (cualquier aportación será bienvenidad y aplaudida)

Instalación

Entiendo que muchos de los “parroquianos” de este rincón no sois programadores (ni falta que os hace, bastante tenéis con la pasión que compartimos por la tecnología y las ganas de aprender ¿no os parece?) y que algunos llegarán, vía buscadores, buscando una solución inmediata a sus necesidades.

El objetivo de este primer artículo es dar difusión a la idea (el código, aunque funcional, no deja de ser una “prueba de concepto con pretensiones” 😉 ) pero:

  • acabo de publicar un artículo explicando cómo instalar PIP en una NAS (para facilitar la instalación de las librerías de las que depende el proyecto)
  • cualquier ayuda que podáis necesitar (si no podéis esperar para probar el código o lo necesitáis con urgencia) no dudéis en comentar que os responderé lo antes posible y, si lo consideráis oportuno, dedico un artículo “monográfico” explicando cómo instalar todo lo necesario y ponerlo en funcionamiento ¿Qué os parece? (sospecho que me va a tocar hacerlo “sí o sí” porque, entre otras cosas no he publicado ni ejemplos de tareas en cron indicando cómo usarlo 😳)

Conclusión

Presentación en “sociedad” de una prueba de concepto que considero lo suficientemente interesante como para compartirla con todos vosotros con la esperanza de recibir vuestras sugerencias y (si tengo suerte) y/o participación (¿con código?¿vistas en la base de datos para nuevos informes?¿pruebas en otros entornos?)

Estoy deseando recoger los datos completos de un mes para llevar al comercial (de la empresa que me proporciona el servicio de conexión a Internet) el pdf con las velocidades de mi conexión 😉

Y tú…

  • ¿Montarías el script en tu NAS o RPi?
  • ¿Consideras interesante y/o útil el proyecto?
  • ¿Qué le añadirías?
  • ¿Dónde lo usarías?

33 comentarios en “Generando informes de velocidad ADSL automáticamente

  1. Julio dijo:

    Muy bueno.

    Visto que podemos comprobar las distintas redes, estaría bien que otra gente con sus máquinas pueda alimentar una base de datos más grande compartida.
    Esto añade una complejidad y es que yo te pueda pasar datos de manera trasparente de lo que voy recolectando.

    Imagina que tienes convencido a tu parroquia y cada uno ejecuta el script en casa para probar su red, a lo mejor a algún profe de matemáticas u otra materia le gustaría estudiar las distintas conexiones, y poder decidir que efectivamente una red es mejor que otra, así que habría que identificar la red estudiada, que máquina la hace, si hay algún que otro elemento, etc y poder almacenar estos datos todos juntito para hacer algún análisis estadístico.

    Ahora se puede ejecutar cada un en casa y estudiar por separado, cosa que está muy bien.

    Gracias por compartir.

    • Muy interesante propuesta Julio aunque imagino que a las operadoras no les haría tanta gracia que todos pudiésemos tener datos reales y contrastables ¡Me gusta!

      Habría que encontrar la forma de identificar unívocamente las mediciones de cada usuario. Inicialmente pensaba en la IP externa pero claro, (salvo en mi caso 😉) esta suele cambiar ¿Se os ocurre algo que no sea un sistema de login con usuario/clave?

      También quedaría pendiente poder determinar tanto la ubicación como el proveedor (si speedtest lo hace por qué no vamos a poder nosotros)… Igual hasta el cliente que estoy usando devuelve dicha información (no recuerdo haberla visto pero es cuestión de indagar ¿no os parece?)

      • Julio dijo:

        Yo usaría datos anónimos para identificar las conexiones, quizás hostname, quizás username, versión de sistema, ruta desde donde ejecuto. Ip local, Ip desde donde salgo, uid del disco para identificar, mac de la tarjeta de red, pero siempre anónimos.

        Esto también puede ser un problema que alguien se enfade y te sature de datos, ….

        • Quizás una “semilla” (tipo UUID como propones) no sería mala idea, Evidentemente no se debería nunca almacenar datos de una persona concreta… no lo usaría ni yo 🙂

          Sería interesante poder contar con la posibilidad, a la hora de contratar un servicio de ADSL contar con datos en mi zona / provinciales / nacionales para cada uno de los proveedores para tomar una decisión.

          De todos modos, a estas alturas es mera “ciencia ficción” pues requeriría que lo usasen muchas personas y, de momento (y como ha “experimentado Juan Txonta) no es sencillo ni de instalar 😅

  2. Hola @jasvazquez. Probando desde una consola 3.2.0-123-generic #166-Ubuntu SMP Mon Feb 20 11:53:20 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux:
    juan@juan-compaq:~/Descargas/testVelocidad-master$ pip install -r dependencias.lst
    Traceback (most recent call last):
    File “/usr/local/bin/pip”, line 9, in
    load_entry_point(‘pip==9.0.1’, ‘console_scripts’, ‘pip’)()
    File “/usr/lib/python3/dist-packages/pkg_resources.py”, line 337, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
    File “/usr/lib/python3/dist-packages/pkg_resources.py”, line 2280, in load_entry_point
    return ep.load()
    File “/usr/lib/python3/dist-packages/pkg_resources.py”, line 1990, in load
    entry = __import__(self.module_name, globals(),globals(), [‘__name__’])
    File “/usr/local/lib/python3.2/dist-packages/pip-9.0.1-py3.2.egg/pip/__init__.py”, line 21, in
    from pip._vendor.requests.packages.urllib3.exceptions import DependencyWarning
    File “/usr/local/lib/python3.2/dist-packages/pip-9.0.1-py3.2.egg/pip/_vendor/requests/__init__.py”, line 66, in
    from .models import Request, Response, PreparedRequest
    File “/usr/local/lib/python3.2/dist-packages/pip-9.0.1-py3.2.egg/pip/_vendor/requests/models.py”, line 856
    http_error_msg = u’%s Client Error: %s for url: %s’ % (self.status_code, reason, self.url)
    ^
    SyntaxError: invalid syntax

    • repasando la instalación de pip avanza:
      juan@juan-compaq:~/Descargas/testVelocidad-master$ sudo pip install -r dependencias.lst
      Downloading/unpacking appdirs==1.4.0 (from -r dependencias.lst (line 1))
      Running setup.py egg_info for package appdirs

      Downloading/unpacking packaging==16.8 (from -r dependencias.lst (line 2))
      Running setup.py egg_info for package packaging

      warning: no previously-included files found matching ‘.travis.yml’
      warning: no previously-included files found matching ‘dev-requirements.txt’
      no previously-included directories found matching ‘docs/_build’
      no previously-included directories found matching ‘tasks’
      Downloading/unpacking pygal==2.3.1 (from -r dependencias.lst (line 3))
      Running setup.py egg_info for package pygal

      Downloading/unpacking pyparsing==2.1.10 (from -r dependencias.lst (line 4))
      Running setup.py egg_info for package pyparsing

      Downloading/unpacking simplejson==3.10.0 (from -r dependencias.lst (line 5))
      Running setup.py egg_info for package simplejson

      Requirement already satisfied (use –upgrade to upgrade): six==1.10.0 in /usr/local/lib/python2.7/dist-packages (from -r dependencias.lst (line 6))
      Downloading/unpacking speedtest-cli==1.0.2 (from -r dependencias.lst (line 7))
      Running setup.py egg_info for package speedtest-cli

      Downloading/unpacking ushlex==0.99 (from -r dependencias.lst (line 8))
      Running setup.py egg_info for package ushlex

      Installing collected packages: appdirs, packaging, pygal, pyparsing, simplejson, speedtest-cli, ushlex
      Running setup.py install for appdirs

      Running setup.py install for packaging

      warning: no previously-included files found matching ‘.travis.yml’
      warning: no previously-included files found matching ‘dev-requirements.txt’
      no previously-included directories found matching ‘docs/_build’
      no previously-included directories found matching ‘tasks’
      Running setup.py install for pygal
      changing mode of build/scripts-2.7/pygal_gen.py from 644 to 755

      changing mode of /usr/local/bin/pygal_gen.py to 755
      Found existing installation: pyparsing 1.5.2
      Uninstalling pyparsing:
      Successfully uninstalled pyparsing
      Running setup.py install for pyparsing

      Found existing installation: simplejson 2.3.2
      Uninstalling simplejson:
      Successfully uninstalled simplejson
      Running setup.py install for simplejson
      building ‘simplejson._speedups’ extension
      gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c simplejson/_speedups.c -o build/temp.linux-x86_64-2.7/simplejson/_speedups.o
      gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro build/temp.linux-x86_64-2.7/simplejson/_speedups.o -o build/lib.linux-x86_64-2.7/simplejson/_speedups.so

      Running setup.py install for speedtest-cli

      Installing speedtest script to /usr/local/bin
      Installing speedtest-cli script to /usr/local/bin
      Running setup.py install for ushlex

      Successfully installed appdirs packaging pygal pyparsing simplejson speedtest-cli ushlex
      Cleaning up…

      • OK lo voy a probar:
        juan@juan-compaq:~/Descargas/testVelocidad-master$ python testVelocidad.py –help
        usage: testVelocidad.py [-h] [-m] [-g] [-v] [-f]

        optional arguments:
        -h, –help show this help message and exit
        -m, –medicion Registra la velocidad actual de la conexión.
        -g, –grafica Muestra gráficamente las velocidades registradas
        -v, –version Muestra la version del programa
        -f, –fail Simula un fallo lanzando una excepción
        Enfin comprobando los comandos, no me devuelve gran cosa como para anirmar a adentrarme más:
        juan@juan-compaq:~/Descargas/testVelocidad-master$ python testVelocidad.py -m
        juan@juan-compaq:~/Descargas/testVelocidad-master$ python testVelocidad.py -g
        juan@juan-compaq:~/Descargas/testVelocidad-master$ sudo python testVelocidad.py -m
        juan@juan-compaq:~/Descargas/testVelocidad-master$ sudo python testVelocidad.py -g
        ¿porque no me devuelve mas nada? ¿es normal?

        • Sí es normal Juan.

          Ante todo agradecerte que te hayas armado de “valor” y curiosidad para probar el script.

          Cada vez que realizas una medición (parámetro -m) queda anotado en la BD (puedes comprobarlo mirando que cambia la fecha y hora o bien abriendo el fichero velocidades.db, te recomiendo aplicaciones como sqliteman)

          El parámetro -g no te está devolviendo nada (mañana si lo hará) porque la intención era crear un ejemplo de uso de la librería pygal que genera las gráficas en formato SVG (como la que se observa ilustrando el cuerpo del artículo) y la única gráfica habilitada actualmente es la de las velocidades de la semana. Esta gráfica sólo tiene en cuenta los siete días precedentes (y no en el que nos encontramos actualmente, por eso no verás nada hasta mañana 😅)

          Siento no poder ofrecerte, de momento, mucho más y espero que no pierdas interés en el proyecto… desde aquí animarte a probar mañana (o a meterle datos falsos si quieres ver la gráfica generada 😉 ) y a compartir cualquier idea y/o expectativa que pudiese generar el proyecto en ti para poder tenerla en cuenta y mejorarla.

          Como digo en el artículo ¿qué necesitas para que te sea de utilidad el script? Estoy deseando incluirlo

    • Cualquier gráfico que consideres interesante (recuerda que hay uno y es una simple prueba de concepto) no dudes en comentarlo y/o sugerirlo.

      Ya, sin saberlo, me has dado una idea: añadir un parámetro para listar las N últimas anotaciones de velocidad (para ahorrar tener que contar con un sqliteman y poder usarlo en tu servidor ¿lo consideras necesario/imprescindible o invierto el tiempo en otra tarea? 🤔)

  3. Genial que aportes tu script.
    Me interesaría probarlo. ¿Qué debería modificar para instalarlo en mi Raspberry Pi? o ¿podríamos acceder al script que hizo tu amigo para su Raspberry Pi?
    La opción de enviarme el reporte por mail sería un agregado interesante (claro que sea optativo).
    Desde ya muchas gracias.

    • Recomendaría (aunque no es necesario) crear un entorno virtual de Python (aunque existe mucha información en Internet igual os interesa que dedique un artículo a cómo se hace) y luego instalar las dependencias del proyecto tal y como aparece en el comentario de Juan (pip install -r dependencias.lst)

      Respecto al repositorio de Martí, lo tienes en la conversación de Twitter que he enlazado en el artículo.

      Lanzo una “pregunta abierta” a todos…¿dedico un artículo a explicar con detalle la instalación de este script?

      • Julio dijo:

        La respuesta por mi parte es sí es necesario explicar como se instala cosas en python.

        Yo por ejemplo cuando hago algún script, en el código de python escribo los módulos que voy necesiatando en la documentación del archivo principal y como lo instalo (por ejemplo)
        ###
        ### Se necesita para hacer el compomente para lo que sea y se instala:
        ### pip install companenet
        ### apt-get install coponent-pytrhon si está en los repositorios de lo que estoy usando
        ###

        Quizás como idea, te sirva

        • No es mala opción pero (y reconozco mi desconocimiento de las buenas prácticas en Python pues lo uso para “andar por casa”) ¿no sería suficiente con incluir el fichero de dependencias e indicar que se use pip install? (en mi caso he optado por incluir las instrucciones que mencionas en el fichero README.md que acompaña el proyecto)

          Estoy abierto a comentarios al respecto para lograr aprender/conocer cómo suele hacerse y/o qué forma es más cómoda.

          Gracias Julio por todo lo que estás aportando (que sepas que tengo en mente tu sugerencia inicial y ya tengo “enfilado” cómo anotar el proveedor del servicio… me queda mucho para alcanzar tu solución pero, aun considerándola “extras” de la versión N.0, no dejo de darle vueltas 😉 )

      • ¿dedico un artículo a explicar con detalle la instalación de este script?

        Si, por favor. A mi me interesaría instalarlo en una RaspberryPi. Te agradezco el tiempo que dedicas a la comunidad.

        Un cordial saludo.

        • Y yo te agradezco que comentes tus inquietudes y/o “apetencias” por aquí.

          Actualmente tengo “secuestrada” mi RPi3 en un “mar de cables”

          pero, tan pronto logre “rescatarla” prometo documentar el proceso.

          Mientras tanto no debería ser realmente complicado portar el script a una “raspí”… bastaría instalar python, pip y virtualenv (para que no haya conflictos de liberías con otros proyectos)

          ¿Te animas a probar y te doy soporte para los problemas que vayan surgiendo? (sospecho que mi RPi va a tardar un poco en volver al hogar) 😉

      • Cuanto más se explique mejor. Incluso el resto del código, no solo la instalación.

        Se dice que lo mejor para aprender es leer código y cada vez echo más en falta “anotaciones al pié de página” , como en los buenos libros.

        • Igual el código no es un buen libro de texto 😏

          Siempre he pensado que el buen código es el que se explica a si mismo pero veo que no debo ser un buen “escritor” cuando es la segunda vez que “sugieres” que comente el código 😅

          Prometo afanarme en documentar (sobre todo por mi mala memoria y cuando me toque modificar algo tras el paso del tiempo jeje)

    • Hola Eduardo, acabo de subir una nueva versión del script a Github con el parámetro -la NUM_ANOTACIONES que te permitiría añadir una nueva tarea (¿diaria y/o semanal?) a cron para pedir las últimas NUM_ANOTACIONES registradas en la BD.

      El propio cron tiene la posibilidad de enviar el resultado mostrado por el script en pantalla a través del correo electrónico.

      No dudes en preguntar cualquier duda que te pueda surgir… espero que te resulte de utilidad tanto como a mi (se acabó tener que traerme la BD a mi ordenador de trabajo… cron me enviará un extracto por correo 😉 )

  4. Julio dijo:

    Hola de nuevo esta es mi experiencia en la instalación y uso del programa.

    Uso git para obtener el programa y los ficheros necesarios (no hace falta permisos especiales)

    jra@GA-B75TN-00 ~ $ git clone https://github.com/jasvazquez/testVelocidad.git

    El resultado es una carpeta en mi equipo con los ficheros. Esta carpeta se llama testVelocidad

    Ahora me toca instalar mediante pip los módulos necesarios que necesita el programa para funcionar y necesito permisos de administrador, así que en mi máquina ejecuto

    jra@GA-B75TN-00 ~/testVelocidad $ sudo su

    y voy instalando uno a uno los módulo de python mediante pip. Hay algunos que los tenía y otros que no los tenía.

    Ojo esto funciona porque tengo instalado python, pip, git. Si no tenemos esto o lo instalamos o lo hacemos de otra manera para conseguir el software.

    GA-B75TN-00 testVelocidad # pip install appdirs
    GA-B75TN-00 testVelocidad # pip install packaging
    GA-B75TN-00 testVelocidad # pip install pygal
    GA-B75TN-00 testVelocidad # pip install pyparsing
    GA-B75TN-00 testVelocidad # pip install simplejson
    GA-B75TN-00 testVelocidad # pip install six
    GA-B75TN-00 testVelocidad # pip install speedtest-cli
    GA-B75TN-00 testVelocidad # pip install ushlex

    Una ves hecho esto ya no es necesario más permisos de Administrador y ya puedo ejecutar el programa

    En mi ejemplo sobre mi conexión ADSL de telefónica
    jra@GA-B75TN-00 ~/testVelocidad $ time python testVelocidad.py -m

    Este es el resultado de lo que tarda en ejecutarse (como medio minuto)
    real 0m24.287s
    user 0m0.840s
    sys 0m0.316s

    Luego veo los registro en la base de datos y estos son los resultados de las cinco primeras ejecuciones, no lo meto en el cron:

    “ID”, “fecha”, “ping”, “bajada”, “subida”, “server”
    “353”, “2017-03-03 19:59:29”, “69.788”, “7.48391675255661”, “0.605524273054436”, “6583”
    “354”, “2017-03-03 20:07:40”, “57.187”, “7.5271335885475”, “0.65805871265466”, “1652”
    “355”, “2017-03-03 20:10:04”, “59.963”, “7.78822378997431”, “0.814003811184962”, “6583”
    “356”, “2017-03-03 20:10:57”, “57.181”, “8.16775329956291”, “0.888831212879714”, “8109”
    “357”, “2017-03-03 20:11:40”, “59.703”, “8.04537225593517”, “0.736751826398849”, “6583”

    Muchas gracias por compartir.

    Julio.

    • Gracias a ti por molestarte en documentar la instalación del script, Julio.

      Personalmente recomendaría el uso de virtualenv e instalar las dependencias utilizando el fichero que se adjunta, ¿te ha dado problemas y por ello has optado por instalar las librerías una a una utilizando pip?

      Sería interesante dejar la tarea programada con cron y ver cómo evolucionan las mediciones que indicas (por encime de 55ms de ping ya me parece algo alta pero para evaluarlo correctamente habría que mirar qué tal se porta a lo largo de varios días/horas)

      Nuevamente, gracias Julio

      • Julio dijo:

        Hola de nuevo, no sé porqué cuando meto el script en el cron, los resultados del test son 0.

        */15 * * * * /usr/bin/python /home/jra/testVelocidad/testVelocidad.py -m

        No importa mucho, me he creado un script en bash para simularlo y lo dejaré corriendo en mi máquina, sin necesidad del cron

        Este es el script de prueba

        #!/bin/bash
        echo Ejecutando la monitorizacion de la linea ADSL
        cd /home/jra/testVelocidad
        while true
        do
        echo “Press [CTRL+C] para pararlo ,..”
        python /home/jra/testVelocidad/testVelocidad.py -m
        echo Fin de la ejecución de la prueba de la linea ADSL
        sleep 15m
        done

        Espero tener algunos datos para poder darte en un tiempo prudente. ¿cómo te paso el fichero velocidades.db?

        Un saludo.

        • Julio dijo:

          Hola revisando un poco el proyecto he visto que hay un trigger en la base de datos que pone la fecha fecha de la medición.

          — Describe TRG_ANOTACION
          CREATE TRIGGER trg_Anotacion after INSERT ON Anotacion
          for each row
          BEGIN
          UPDATE anotacion set fecha = DATETIME(‘NOW’) where id=new.id;
          END

          La fecha la pone en formato estándar. En mi caso las anotaciones las anota en horario del meridiano de Greenwich, es decir con una hora menos de la hora en que se produce el test. Sería bueno anotar desde que sitio se hace la medición para saber cual es la hora local de la medición. Como mejora del programa.

          Un saludo.

        • Espectacular tu aportación Julio, gracias de todo corazón: haces que seguir contribuyendo al proyecto merezca la pena 👍

          El valor a cero en las anotaciones de la BD se debe, principalmente, a dos motivos:

          1. Que no esté instalado speedtest-cli (debería pues se encuentra en el fichero de dependencias a instalar
          2. No haya conexión a internet (lo dudo)

          Resulta extraño que te funcione desde la línea de comandos y no desde cron (¿con qué usuario lo lanzas en la terminal?)

          Personalmente me aventuraría a decir que el problema pueda deberse a que no estés usando los entornos virtuales de Python como sugiero en las anotaciones de Github sobre la instalación del script ¿es posible?

        • Conocía el problema pero por pereza falta de tiempo opté por obviarlo 😅

          Me parece una gran aportación y la voy a anotar como la primera tarea del proyecto (ilusión al 100% con este nuevo “hito” 😉 )

          Respecto a cómo enviarme el fichero velocidades.db, te contacto a través del correo electrónico que has incluido en tus comentarios 😉

  5. Julio dijo:

    Hola de nuevo, efectivamente pasé olímpicamente de los entornos virtuales, así que seguramente es esto. Es lo que tiene no hacer ni caso a lo que propone el programador.

    Con respecto al cron lo probé desde mi usuario, pero vamos que tampoco es un problema de momento, porque estamos en pruebas, je je.

    Revisando los datos de mi ADSL se puede afirmar que estoy pagando un pasta por una castaña de línea, pero bueno, será la escusa para buscar algo de fibra.

    P.D. Dejo pasar un par de días con la máquina encedida y te paso por correo la base de datos cuando 500 o 600 anotaciones.

    • Claro que no me lo tomo a mal, descuida.

      Tengo tendencia a programar en Python 2 por malas experiencias pasadas con la v3 pero es totalmente factible pasarlo casi tal cual está.

      ¿Lo consideráis un “must have” (para dar el salto de versión)?

      • Más que un “must have”, creo que de esa manera “envejecería” mejor, debido a que algunas distros ya están teniendo python3 por defecto como fedora, arch, gento, etc.
        yo trate de convertir los archivos con 2to3 y me manda errores :-/

        el primero fue

        khrysro@openSUSE:~/testVelocidad> python3 testVelocidad.py –help
        Traceback (most recent call last):
        File “testVelocidad.py”, line 4, in
        import ushlex as shlex
        File “/usr/lib/python3.4/site-packages/ushlex.py”, line 59
        print ‘shlex: reading from %s, line %d’ \
        ^
        SyntaxError: Missing parentheses in call to ‘print’

        que lo espere solucionar con

        khrysro@openSUSE:~/testVelocidad> sudo 2to3 /usr/lib/python3.4/site-packages/ushlex.py -w

        pero genero el siguiente error y ahora si que no se como continuar

        khryros@openSUSE:~/testVelocidad> python3 testVelocidad.py –help
        Traceback (most recent call last):
        File “testVelocidad.py”, line 175, in
        args = parser.parse_args()
        File “/usr/lib64/python3.4/argparse.py”, line 1728, in parse_args
        args, argv = self.parse_known_args(args, namespace)
        File “/usr/lib64/python3.4/argparse.py”, line 1760, in parse_known_args
        namespace, args = self._parse_known_args(args, namespace)
        File “/usr/lib64/python3.4/argparse.py”, line 1966, in _parse_known_args
        start_index = consume_optional(start_index)
        File “/usr/lib64/python3.4/argparse.py”, line 1906, in consume_optional
        take_action(action, args, option_string)
        File “/usr/lib64/python3.4/argparse.py”, line 1834, in take_action
        action(self, namespace, argument_values, option_string)
        File “/usr/lib64/python3.4/argparse.py”, line 1016, in __call__
        parser.print_help()
        File “/usr/lib64/python3.4/argparse.py”, line 2359, in print_help
        self._print_message(self.format_help(), file)
        File “/usr/lib64/python3.4/argparse.py”, line 2343, in format_help
        return formatter.format_help()
        File “/usr/lib64/python3.4/argparse.py”, line 278, in format_help
        help = self._root_section.format_help()
        File “/usr/lib64/python3.4/argparse.py”, line 208, in format_help
        func(*args)
        File “/usr/lib64/python3.4/argparse.py”, line 208, in format_help
        func(*args)
        File “/usr/lib64/python3.4/argparse.py”, line 515, in _format_action
        help_text = self._expand_help(action)
        File “/usr/lib64/python3.4/argparse.py”, line 602, in _expand_help
        return self._get_help_string(action) % params
        TypeError: unsupported operand type(s) for %: ‘bytes’ and ‘dict’

        • Uuupps… duele nada mas verlo.

          Uso Manjaro (basado en Arch) y se incluye, entre otras versiones, Python v2.

          Creo la tarea y abro la discusión de cuántos consideráis importante invertir tiempo en esta funcionalidad en lugar de otras posibles ampliaciones.

          Gracias tanto por la sugerencia como por el interés mostrado por poder usarlo, khrysro.

          Si te parece, contáctame y vemos cómo hacer funcionar correctamente Python v2 en tu distribución (igual me da pie a algún artículo de “autoayuda” 😉 )

  6. Hola, yo de nuevo,
    Leyendo y probando logre dar con lo necesario para que funcione tanto en python2 como en python3

    solo tuve que añadir un paréntesis a la linea 189, después de print, ya que python3 da error si no esta entre parentesis y python2 lo imprime igual, con o sin parentesis

    if args.listarAnotaciones or args.listarAnotaciones==0:
    print (listarAnotaciones(args.listarAnotaciones))#<– aqui

    y lo otro después de leer acá https://docs.python.org/3/library/argparse.html le quitate la codificación "utf-8" a los "parser" y con eso funciona en ambos python2 y 3 quedando así.

    parser=argparse.ArgumentParser()
    parser.add_argument('-m', '–medicion', help=u'Registra la velocidad actual de la conexión.',action="store_true")
    parser.add_argument('-la', '–listarAnotaciones', help=u'Muestra las N últimas mediciones de velocidad', nargs="?", const=10, type=int)
    parser.add_argument('-g', '–grafica', help=u'Muestra gráficamente las velocidades registradas',action="store_true")
    parser.add_argument('-v', '–version',help=u"Muestra la version del programa",action="store_true")
    parser.add_argument('-f', '–fail',help=u"Simula un fallo lanzando una excepción",action="store_true")

    args = parser.parse_args()

    Quizá eso pueda ocasionar problemas en otra parte pero al menos así me funciona con ambos 🙂

    saludos

    • Espectacular compi, gracias por el tiempo que has invertido y las molestias que te has tomado 👍

      Tengo problemas evidentes y preocupantes con la conexión (origen de la creación de este script) pero, en cuanto, la recupere ten por seguro que lo pruebo 😉

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s