Raspberry Pi: Internet-Geschwindigkeit-Tests automatisieren (kurz & gut)
Listen! This is now, this is here
This is me, this is what I wanted
You to see
That was then, that was that
That is gone, that is past
You cast yourself, cast
Passed by, thrown down fast, you say
“So fast, so numb”, REM
Achtung! Dieser Beitrag ist veraltet und wird nicht mehr gepflegt.
Es steht eine aktuellere Version der Anleitung zur Verfügung.
Letzter Stand: 17.03.2020
Der kostengünstige Einplatinen-Rechner Raspberry Pi lässt sich für viele Dinge (miss-)brauchen. Momentan lassen wir darauf zu Test-Zwecken unser Heimautomatisierungs-System FHEM laufen. Eigentlich nur eine mehr-oder-weniger kleine Spielerei mit Homematic-Funk-Sensoren und -Aktoren. Zur Zeit wird z.B. der Fernseh-Bereich samt Zuspieler automatisch über Nacht abgeschaltet, falls der Verbrauch unter eine bestimmte Schwelle fällt. Falls es beim Lüften im Bad zu kalt wird, meldet ein Temperatur-Sensor über FHEM mittels einer Pushnachricht (Pushbullet->) dies an uns. Sehr nützlich ist auch die Sprach-Ausgabe über SONOS, dass der Waschgang der Waschmaschine im Keller abgeschlossen ist und die Wäsche entnommen werden kann.
Mitunter messen wir in regelmäßigen Abständen (eine Stunde) wie schnell unser DSL-Zugang in beide Richtungen funktioniert (Down- & Upload):
Warum? Es ist ganz nett zu sehen, ob der Provider in der Tat seine Versprechen eingehalten hat oder nicht. Außerdem merkt man deutlich, dass die Bandbreite (etwa um die Hälfte!) sinkt, wenn man seinen Router über die Powerline zum DSL-Modem anbindet.
Alles schön und gut. Nun wollen wir demnächst umziehen. Aus logistischen Gründen können wir in die neue, bereits gemietete Wohnung allerdings erst zwei Monate später einziehen. Somit haben übergangsweise beide Wohnungen zu bezahlen. Diese doppelte Haushaltsführung hat aber auch kleine Vorteile. In dieser Zwischenzeit kann man sich z.B. um den Internet-Zugang für die neue Wohnung kümmern. Da wir aber noch in der alten Wohnung sind – können wir nur schlecht feststellen, ob die Bandbreite zufriedenstellend und der Zugang in der neuen Wohnstätte an sich stabil ist. Deshalb wollen wir die FHEM-basierte Einrichtung zur Speedmessung zunächst in der alten “Bude” belassen und mit dem Zweit-Raspberry-Pi eine empirische quick-&-dirty Messung an der neuen Stätte durchführen. So kann man ggf. noch rechtzeitig den Provider-Wechsel anstreben, falls man mit der aktuellen Leistung nicht zufrieden sein sollte.
Es gibt eine sehr schöne Anleitung dazu – da diese leider einige (Tipp-)Fehler enthält, teilen wir unsere, leicht angepasste Lösung hier mit euch:
1. Messen
Zur Messung benötigen wir einen lauffähigen Raspberry Pi (oder sonstigen Kleinstrechner) inkl. einem (am Besten) Debian-basierten Betriebssystem wie z.B. dem weit-verbreiteten und beliebten Raspbian. Dabei mit Putty eine SSH-Verbindung zum Pi aufbauen und schon gehts los!
Die Messergebnisse werden final in ein einfaches CSV-File geschrieben. Dieses lässt sich anschließend auf alle erdenklichen Art und Weisen auswerten.
Notwendiges installieren:
sudo apt-get install python-argparse python-lxml
UPDATE (13.10.2015): Bei aktuellen Python-Versionen (ab 2.7) ist “python-argparse” bereits enthalten – in diesem Fall einfach weglassen.
UPDATE (13.10.2015): Manchmal fehlt auch das Socks-Paket: In diesem Fall auch installieren: sudo pip install PySocks
Skripte runterladen (Autor: Jannis Jansons):
mkdir ~/scripts
wget https://raw.github.com/Janhouse/tespeed/master/tespeed.py -O ~/scripts/speedtest.py
Dieses Skript testet die Latenz zwischen den verfügbaren Mess-Servern und wählt den besten aus.
Test-Messung durchführen:
python ~/scripts/speedtest.py
Auf manchen Systemen kann folgender Fehler auftauchen:
ImportError: No module named SocksiPy
In diesem Fall das Skript leicht anpassen:
nano ~/scripts/speedtest.py
In Zeile #8 den markierten Teil des Textes so
entfernen.from SocksiPy import socks
Mit Strg+X den Editor verlassen und mit Y die Änderungen speichern.
2. Automatisieren
Skriptausgabe in ein csv-File vorbereiten:
cd ~
mkdir bin
cd ~/bin
nano speedtest.zsh
Folgenden Code im Editor erfassen:
#!/bin/sh echo "\"$(date -R)\",$(python ~/scripts/speedtest.py --csv -s)"
Mit Strg+X den Editor verlassen und mit Y die Änderungen speichern.
File ausführbar machen:
chmod +x speedtest.zsh
Cronjob zur zeitgesteurten, automatischen Ausführung einrichten (Ausführung jede Stunde):
crontab -e
0 * * * * bash ~/bin/speedtest.zsh 2>/dev/null >> ~/speedtest.csv
Mit Strg+X den Editor verlassen und mit Y die Änderungen speichern.
3. Auswerten
Nach einigen Stunden kann man bereits die Ergebnisse auswerten. Dazu am Besten mit einem FTP-Client wie FileZilla am Raspberry Pi anmelden und die speedtest.csv herunterladen.
Mit der Tabellenkalkulation der Wahl kann man die CSV-Datei grafisch aufbereiten:
4. Chillen
Nach getaner Arbeit ein Bier öffnen und genießen. 🙂
UPDATE (13.10.2015): Fixed typos: Skripts shebang-Anweisung; cron-Jobs Direktangabe der shell
Comments (64)
Die Kommentarfunktion ist für diesen Beitrag deaktiviert.
Hallo,
wo genau finde ich per FileZilla die *.csv-Datei?
Danke & Gruß
Kevin,
in unserem Beispiel befindet sich die CSV-Datei im “/home/pi/”-Verzeichnis. Über die Konsole (Putty) auch mit “cd ~” zu erreichen! Viel Spass damit! 🙂
Hi,
ich denke, ich habe alles richtig gemacht, bekomme aber die Fehlermeldung
ImportError: No module named socks
Gruß,
petjek
Das Modul scheint zu fehlen, probiers mal bitte mit:
sudo apt-get install python-socksipy
Hi,
bei mir wird die CSV-Datei erstellt aber leider ist diese immer leer.
Woran kann das liegen?
Gruß
Tom
Tom,
offenbar ist das Testergebnis nicht verfügbar. Funktioniert der Aufruf mit
python ~/scripts/speedtest.py
?Hallo,
ich habe das gleiche Problem dass die .csv-Datei leer bleibt. Führe ich das Skript einfach so aus funktioniert alles super.
Grüße
A.Hoehn
Hmm… Ferndiagnose ist immer schwierig. Schau mal ins log, vielleicht steht das was über mögliche Fehler bei der (Cronjob-)Ausführung. Zum Beispiel damit:
cat /var/log/syslog | tail -100
Hallo,
zuerst einmal, danke für die ausführliche Anleitung.
Leider habe ich das gleiche Problem wie Tom. Das Skript lässt sich manuell ausführen, die Bandbreite wird auch gemessen, aber die erstellte CSV-Datei bleibt leider leer. Alles was ich verändert habe sind die Zeitabstände in denen gemessen wird. In meinem Fall alle 5min:
*/5 * * * * ~/bin/speedtest.zsh 2>/dev/null >> ~/speedtest.csv
Auch eine direkte Adressierung hat leider nicht funktioniert:
*/5 * * * * /home/pi/bin/speedtest.zsh 2>/dev/null >> /home/pi /speedtest.csv
Angehängt der Log. Es liegt wohl lediglich am Schreiben der CSV-Datei. Kann es vielleicht auch daran leigen, dass ich den Speedtest über Wlan durchführe?
Oct 11 15:25:01 raspberrypi /USR/SBIN/CRON[2884]: (pi) CMD (~/bin/speedtest.zsh 2>/dev/null >> ~/speedtest.csv)
Oct 11 15:25:31 raspberrypi wpa_supplicant[1744]: wlan0: WPA: Group rekeying completed with XX:XX:XX:XX:XX:XX [GTK=CCMP]
Oct 11 15:28:38 raspberrypi dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 3
Oct 11 15:28:41 raspberrypi dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 3
Oct 11 15:28:44 raspberrypi dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 4
Oct 11 15:28:48 raspberrypi dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 7
Oct 11 15:28:55 raspberrypi dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 7
Oct 11 15:29:02 raspberrypi dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 13
Oct 11 15:29:15 raspberrypi dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 17
Oct 11 15:29:32 raspberrypi dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 7
Oct 11 15:29:39 raspberrypi dhclient: No DHCPOFFERS received.
Oct 11 15:29:39 raspberrypi dhclient: No working leases in persistent database – sleeping.
Oct 11 15:30:01 raspberrypi /USR/SBIN/CRON[2891]: (pi) CMD (~/bin/speedtest.zsh 2>/dev/null >> ~/speedtest.csv)
Oct 11 15:32:37 raspberrypi dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 3
Oct 11 15:32:40 raspberrypi dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 4
Oct 11 15:32:44 raspberrypi dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 7
Oct 11 15:32:51 raspberrypi dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 11
Oct 11 15:33:02 raspberrypi dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 11
Oct 11 15:33:13 raspberrypi dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 7
Oct 11 15:33:20 raspberrypi dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 12
Oct 11 15:33:33 raspberrypi dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 5
Oct 11 15:33:38 raspberrypi dhclient: No DHCPOFFERS received.
Oct 11 15:33:38 raspberrypi dhclient: No working leases in persistent database – sleeping.
Gruß Daniel
Daniel,
Danke für die ausführlichen Infos! Ich habe die gesamte Installation nochmal durchgespielt und dabei einige Typos gefixed –> Skript:
#!/bin/sh
echo "\"$(date -R)\",$(python ~/scripts/speedtest.py --csv -s)"
crontab -e:
0 * * * * bash ~/bin/speedtest.zsh 2>/dev/null >> ~/speedtest.csv
Damit sollte es klappen – wenn nicht, bitte melden! 🙂
Moin Moin,
vielen Dank für den Interssanten Beitrag. Ich hänge momentan an dem Punkt “Skripte herunterladen fest”. Folgende Meldung kommt:
pi@raspberrypi ~ $ wget https://raw.githup.com/Janhouse/tespeed/master/tespeed.py -O ~/scripts/speedtest.py
–2015-09-24 05:58:27– https://raw.githup.com/Janhouse/tespeed/master/tespeed.py
Auflösen des Hostnamen »raw.githup.com (raw.githup.com)«… 95.211.117.206
Verbindungsaufbau zu raw.githup.com (raw.githup.com)|95.211.117.206|:443… fehlgeschlagen: Die Wartezeit für die Verbindung ist abgelaufen.
Erneuter Versuch.
Woran könnte das liegen?
Viele Grüße, Ray
Ray,
der Abruf von github hat sich scheinbar inzwischen geändert, probiers bitte mal mit:
wget https://raw.githubusercontent.com/Janhouse/tespeed/master/tespeed.py -O ~/scripts/speedtest.py
(statt: wget https://raw.github.com/Janhouse/tespeed/master/tespeed.py -O ~/scripts/speedtest.py)
… hat sich gerade erledigt. War nur ein rechtschreibfehler. 😀
Hi, ich hab dasselbe Problem, dass die CSV immer leer bleibt. Der Log zeigt an, dass der cronjob ausgeführt wird, getaktet auf alle 2 Minuten (zum Test).
Nov 13 11:16:02 raspberrypi CRON[10258]: (pi) CMD (bash ~/bin/speedtest.zsh 2>/dev/null >> ~/speedtest.csv)
Nov 13 11:17:01 raspberrypi CRON[10288]: (root) CMD ( cd / && run-parts –report /etc/cron.hourly)
Nov 13 11:18:01 raspberrypi rsyslogd-2007: action ‘action 17’ suspended, next retry is Fri Nov 13 11:19:31 2015 [try http://www.rsyslog.com/e/2007 ]
Nov 13 11:18:01 raspberrypi CRON[10354]: (pi) CMD (bash ~/bin/speedtest.zsh 2>/dev/null >> ~/speedtest.csv)
Nov 13 11:20:01 raspberrypi rsyslogd-2007: action ‘action 17’ suspended, next retry is Fri Nov 13 11:21:31 2015 [try http://www.rsyslog.com/e/2007 ]
Nov 13 11:20:01 raspberrypi CRON[10371]: (pi) CMD (bash ~/bin/speedtest.zsh 2>/dev/null >> ~/speedtest.csv)
Wenn ich die CSV lösche wird diese auch wieder entsprechend erstellt, bleibt aber leer. Tippfehler sind garantiert keine drin. Wenn ich das Script manuell ausführe, bleibt die CSV auch leer.
Edit:
Wenn ich
“python ~/scripts/speedtest.py –csv -s”
ausführe, dann bleibt die CSV auch leer, sowie sie leer bleibt, wenn ich
“bash speedtest.zsh” ausführe.
Brot, was passiert wenn du
bash ~/bin/speedtest.zsh 2>/dev/null >> ~/speedtest.csv
ausführst?Interessanterweise nichts. Hinterlässt auch keine Spur im log. Die Kommandozeile bleibt einfach wie sie ist, es tritt auch kein Fehler auf.
Ich hab jetzt statt
“bash ~/bin/speedtest.zsh 2>/dev/null >> ~/speedtest.csv”
mal
“bash ~/speedtest.zsh 2>/dev/null >> ~/speedtest.csv”
ausgeführt, da sich die speedtest.zsh sich nicht in bin befindet, sondern in pi.
Nun hat er tatsächlich geloggt.
Ok, der Fehler ist gefunden. Meine speedtest.zsh war nicht im bin-Ordner, aber die crontab verwies auf ~/bin/speedtest.zsh.
Super! 😀 Freut mich, dass es nun klappt! Vielen Dank für die Rückmeldung!
Hallo,
ich schließe mich erst mal den Danksagungen für die tolle Anleitung an. Ich habe nur noch ein kleines Problem. Wenn ich den Befehl manuell ausführe funktioniert alles immer einwandfrei und es wird wie gewünscht ein Eintrag in die CSV geschrieben. Wenn ich den Befehl jedoch über cron ausführe schreibt er mir nur Datum und Uhrzeit in die CSV. Die Messergebnisse fehlen einfach immer. Vielen Dank für jede Hilfe.
Grüße Dan
Dan, das ist komisch… Ferndiagnose ist ohne weitere Angaben leider auch schwierig. Der Job scheint ja zu grundsätzlich zu funktionieren, offenbar ist die Skript-Definition nicht ganz sauber. Kannst du diese bitte überprüfen? Danke!
Hallo,
vielen Dank für die schnelle Hilfe. Daran lag es. Ich hatte bereits bei meinem bash das Problem, dass ich der Platzhalter “~” nicht funktioniert hat. In meinem Script habe ich das jetzt durch “/home/user” ersetzt und jetzt funktioniert alles. Danke nochmal!
Gruß
Dan
Super Dan – das freut uns! Vielen Dank für die Rückmeldung!
Bei mir kam der Fehler ImportError: No module named lxml und der oben genannte Befehl für die Installation
ging auch nicht.
sudo apt-get install python-lxml
Hat bei mir dann funktioniert.
Skund, jap – je nach Distributions-Version-Stand kann es schonmal vorkommen, dass das ein oder andere Paket fehlt. Du hast es richtig gelöst: Einfach die fehlenden Pakete installieren! Danke für deine Rückmeldung und den Hinweis zur Lösung! 🙂
Ich wollte auch das Speedtest Script installieren, da meine DSL Verbindung abends immer einbricht und ich der Telekom gerne einen Beweis über die schlechte Verbindung belegen wollte. Leider schaffe ich es nicht, das Script runterzuladen. Bekomme im LXTerminal immer folgende Fehler:
————————————————————————————————
pi@raspberrypi:~ $ wget https://raw.githubusercontent.com/Janhouse/tespeed/master/tespeed.py-O ~/scripts/speedtest.py
–2016-02-14 23:08:31– https://raw.githubusercontent.com/Janhouse/tespeed/master/tespeed.py-O
Auflösen des Hostnamen »raw.githubusercontent.com (raw.githubusercontent.com)«… 23.235.43.133
Verbindungsaufbau zu raw.githubusercontent.com (raw.githubusercontent.com)|23.235.43.133|:443… verbunden.
HTTP-Anforderung gesendet, warte auf Antwort… 404 Not Found
2016-02-14 23:08:32 FEHLER 404: Not Found.
/home/pi/scripts/speedtest.py: Schema fehlt.
pi@raspberrypi:~ $
——————————————————————————————————–
Fehlermeldung kommt, egal ob ich raw.github.com oder raw.githubusercontent.com nehme.
Würde mich über Hilfe freuen.
Vielen Dank
Willy,
wir haben (momentan) mit beiden adressen keine Probleme. Kann es sein, dass noch ein Leerzeichen fehlt: Zwischen “.py ” und ” -O “?
wget https://raw.github.com/Janhouse/tespeed/master/tespeed.py -O ~/scripts/speedtest.py
Hallo wollte mich bedanken für die tolle Anleitung und folgende Bemerkung machen:
Unter RPi3 (Jessie) ist gibt es nach “sudo apt-get install python-argparse python-lxml” folgende Fehlermeldung:
“Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:
The following packages have unmet dependencies:
python-argparse : Depends: python2.6 but it is not installable
E: Unable to correct problems, you have held broken packages.”
Lösung: unter Python3 ist das bereits installiert, damit aber sppedtest.py nicht folgenden Fehler auswirft:
“Traceback (most recent call last):
File “speedtest.py”, line 26, in
from lxml import etree
ImportError: No module named lxml”
muss in speedtest.py die Zeile 26: #from lxml import etree
in: import xml.etree.ElementTree as etree
geändert werden.
Grüße
Jakob, herzlichen Dank für deinen Hinweis – wir schätzen deine Rückmeldung sehr, ein wertvoller Tipp für alle RPi3-Besitzer! Als wir den Artikel initial schrieben, war der Raspberry Pi 3 noch nicht auf dem Radar… 🙂
Vielen Dank erst einmal für eure überaus hilfreiche Beschreibung. Basierend auf der produzierten speedtest.csv-Datei habe ich in R ein kleines Skript zur Visualisierung der Ergebnisse geschrieben, welches auf meinem Server basierend auf einem Banana Pi läuft. Die Beschreibung zur Einrichtung und das Skript zur Visualisierung findet sich hier:
https://www.aqualogy.de/dsl-geschwindigkeiten/
Ja, wenn denn der Webserver erreichbar ist… ;(
[…] habe ich beschlossen Verbindungsgeschwindigkeiten und Erreichbarkeit zu überwachen. Basierend auf diesem Blogpost und dem zugrundeliegenden Python-Tool zur Messung von Verbindungsgeschwindigkeiten von […]
Funktioniert super, Besten Dank!
Hi
Danke für dieses sehr gute Script. Es hat gleich beim ersten mal super funktioniert.
Eine Fragen hätte ich trotzdem noch schnell.
Kann man dieses Script auch auf eine spezielle Schnittstelle anwenden da ich versuchen will einen Vergleich zwischen Festnetz Internet und LTE Stick zu generieren. Und falls wie?
Patrick,
das Skript von Janhouse gibt das (momentan) leider nicht her. Den Wunsch gab es schon länger: https://github.com/Janhouse/tespeed/issues/12
Sorry! 🙁
Danke für das Script/ die Anleitung, bei mir wird allerdings immer (chronjob, Aufruf von speedtest.zsh und beim ausführen von bash ~/bin/speedtest.zsh 2>/dev/null >> ~/speedtest.csv) nur die Zeit in die Datei geschrieben. Wenn ich speedtest.py über python speedtest.py aufrufe funktioniert alles, es wird eben nur nicht gespeichert. Der Log sieht folgend aus Mar 11 22:10:02 raspberrypi /USR/SBIN/CRON[29795]: (pi) CMD (/home/pi/bin/speedtest.zsh 2>/dev/null >> /home/pi/speedtest.csv)
Mar 11 22:11:01 raspberrypi /USR/SBIN/CRON[30076]: (pi) CMD (/home/pi/bin/speedtest.zsh 2>/dev/null >> /home/pi/speedtest.csv)
Mar 11 22:12:01 raspberrypi /USR/SBIN/CRON[30357]: (pi) CMD (/home/pi/bin/speedtest.zsh 2>/dev/null >> /home/pi/speedtest.csv)
Mar 11 22:13:01 raspberrypi /USR/SBIN/CRON[30638]: (pi) CMD (/home/pi/bin/speedtest.zsh 2>/dev/null >> /home/pi/speedtest.csv)
Mar 11 22:14:01 raspberrypi /USR/SBIN/CRON[30919]: (pi) CMD (/home/pi/bin/speedtest.zsh 2>/dev/null >> /home/pi/speedtest.csv)
Mar 11 22:15:01 raspberrypi /USR/SBIN/CRON[31201]: (pi) CMD (/home/pi/bin/speedtest.zsh 2>/dev/null >> /home/pi/speedtest.csv)
Mar 11 22:16:01 raspberrypi /USR/SBIN/CRON[31468]: (pi) CMD (/home/pi/bin/speedtest.zsh 2>/dev/null >> /home/pi/speedtest.csv)
Mar 11 22:17:01 raspberrypi /USR/SBIN/CRON[31750]: (root) CMD ( cd / && run-parts –report /etc/cron.hourly)
Mar 11 22:17:02 raspberrypi /USR/SBIN/CRON[31757]: (pi) CMD (/home/pi/bin/speedtest.zsh 2>/dev/null >> /home/pi/speedtest.csv)
Mar 11 22:18:01 raspberrypi /USR/SBIN/CRON[32040]: (pi) CMD (/home/pi/bin/speedtest.zsh 2>/dev/null >> /home/pi/speedtest.csv)
Weiß jemand, wie ich das fixen kann?
LG kalli
Hi,
sehr cool das Ganze… habs auch schon am Laufen und will mal sehen, wie mein Provider sich so schlägt.
Aber eine interessante Frage wäre da auch noch.
Ich hörte, es gibt Unterschiede in Bezug auf die Latenz zwischen einem DSL Anbieter und einem Kabel Anbieter. Jetzt fänd ich das schon spannend, diesen WErt mal zu messen – und zwar so:
Ich lasse meinen Raspi mal einen Monat bei mir (Kabelanbieter) laufen und hänge das Teilchen dann beim Bekannten (DSL Anbieter) ins Netz.
Somit könnte ich die Latenzen schön vergleichen und meinem Kabelanbieter mal lecker auf die Socken treten.
Was denkst Du?
Gruß
Tom
Servus Tom!
🙂 Das hast du schön gesagt! Die Messung an sich wird höchstwahrscheinlich funktionieren. Ob man die Werte allerdings als rechtlich relevanten Beleg akzeptieren wird, bezweifle ich. Bin allerdings auch kein Anwalt… Du könntest dies aber auch zum Anlass nehmen deinen Vertrag mit dem derzeitigen Anbieter zu überdenken. Freie Anbieterwahl ist doch etwas Feines! 🙂
Moin,
Erst einmal vielen Dank für die klasse Anleitung. Nach ein paar Startschwierigkeiten läuft das Tool perfekt!
Ein Problem habe ich jedoch. Mein Raspberry hängt direkt an der FritzBox, kommt beim Test jedoch nicht über ~24mbit im down, sowie 12mbit im uploads hinaus. Mein Rechner hat i. d.R. 80/30mbit
Der Pi (ich glaub Modell B) ist frisch aufgesetzt, es läuft nichts weiter drauf.
Ist das technisch bedingt, oder habe ich evtl etwas falsch gemacht?
Moin Mads,
eine Ferndiagnose ist grundsätzlich immer schwierig… Dennoch kannst du nicht so einfach die Messungen zweier unterschiedlicher Geräte vergleichen. Abgesehen von der Ausstattung und Vernetzung der Gerätschaften, kann man in der Regel nie sicher sein, dass zwei unterschiedliche Rechner sich mit der selben Quelle verbinden mit der die eigentliche Messung stattfindet.
Vielmehr war der von uns beschriebene Aufbau primär als Langzeitaufzeichnung/-Überwachung angedacht.
Danke für die schnelle Antwort.
Primär nutze ich die Möglichkeit auch als Langzeittest, da ich eine Zeit lang massive Probleme zu bestimmten Zeiten hatte. Ein Techniker hat nun etwas ausgetauscht, was den fehler verursacht haben soll.
Nun möchte ich das gerne “schwarz auf weiß” haben 🙂
Und da der raspberry konstant 24mbit anzeigt gehe ich davon aus, dass das passt (vorher waren das teilweise 0,5mbit…)
Auf jeden Fall noch mal danke für die tolle Anleitung
Hi!
Auch von mir erst einmal vielen Dank für das Script und die Anleitung. Ich habe alles schnell und einfach auf meinen Pi3 installiert bekommen. Musste ledglich – wie beschrieben – das ‘from SocksiPy’ aus der Zeile 8 des Phytonscriptes entfernen.
Was mir aber auch (wie Mads) auffällt: Die Download- und Uploadwerte scheinen mir (teilweise) keine realistische Größenordnung zu haben. Ich habe VDSL100 und komme bei Vergleichsmessungen (an der gleichen Netzwerkdose!) mit anderen Rechnern i. d.R. auf 80/30mbit. Das Script auf dem Pi3 kommt derzeit jedoch immer nur auf Werte von ca. 8/12 mbit.
Das könnte einen vermuten lassen, dass der Pi3 irgendwie nicht performant genug, um so hohe Upload/Downloadraten verarbeiten zu können. Dem ist aber nicht so! Schaue ich mir das Logfile an, sehe ich, dass der Pi in der Vergangenheit auch schon 80/30mbit Werte messen konnte. Ich konnte bisher aber nichts finden, was erklärt, dass der Pi nun nicht mehr auf diese Werte kommt. Habe es mit verschiedenen Downloadservern probiert, die ich dem speedtest.py Script als Parameter mitgebe. Keine Änderung. Egal welchen Server ich nehme, der Pi misst bei mir nun immer nur die ca. 8/12 mbit. Aber: Schließe ich am gleichen Patchkabel einen Windowsrechner an und messe damit über verschiedene Tools die Geschwindigkeit, komme ich konstant auf die 80/30mbit. Wieso aber nicht (mehr) mit dem Pi?
Wenn es so ist, wie es sich mir aktuell darstellt, würde dies ja bedeuten, dass die Messergebnisse die der Pi über die Dauer ausgibt, gar nicht vergleichbar sind. Das kann aber irgendwie auch nicht sein…
Eine Idee, wie ich feststellen kann, was auf dem Pi ‘klemmt’? Oder wie ich die Messergebnisse des Pi über eine andere Methode testen könnte?
Holger,
ich bezweifle, dass der Pi3 nicht potent genug sein soll – bei uns läuft noch der ganz alte Pi1… Womöglich ist etwas anderes “ver-konfiguriert”? Eine Ferndiagnose ist auch hier schwierig – hat sonst jemand ähnliche Erfahrungen mit dem Pi3?
Hallo, bei mir klapp fast alles. Mein RPi 2 erstellt keine csv datei obwohl ich im cron job :0 * * * * bash ~/bin/speedtest.zsh 2>/dev/null >> ~/speedtest.csv
das drin stehen habe.
Können sie mir da weiter helfen ?
Hey Felix,
läuft denn
für sich allein? Bitte prüfen ob cronjobs mit
und nicht mit ggf.
editiert werden.
Vielen Dank für die schöne Anleitung. Das wird mein nächstes Projekt auf dem Pi werden.
Vielleicht ein Hinweis an alle, wo die (automatische) Ausführung nicht funktioniert:
Der Kommandoteil 2>/dev/null leitet die Fehlermeldung ins Nirvana, was bei der Suche natürlich nicht wirklich hilft. Probiert es einfach in diesem Fall mal mit
bash ~/bin/speedtest.zsh >> ~/speedtest.csv 2>&1
Da ist die Fehlermeldung dann zumindest mit in der Ausgabedatei
Hallo,
ich habe deinen Tipp befolgt, in der -csv Datei steht jetzt folgendes:
Mon, 16 Mar 2020 19:00:02 +0100,
Mon, 16 Mar 2020 19:03:33 +0100,
usage: speedtest.py [-h] [–no-download] [–no-upload] [–single] [–bytes]
[–share] [–simple] [–csv]
[–csv-delimiter CSV_DELIMITER] [–csv-header] [–json]
[–list] [–server SERVER] [–exclude EXCLUDE]
[–mini MINI] [–source SOURCE] [–timeout TIMEOUT]
[–secure] [–no-pre-allocate] [–version]
speedtest.py: error: unrecognized arguments: -s
Mon, 16 Mar 2020 19:06:53 +0100,
Könntest du mir da weiterhelfen?
Wie ist denn dein Aufruf genau? Vermutlich ein Tippfehler mit unbekanntem Parameter “-s“
Mittlerweile funktioniert der cronjob in der csv speichert es aber nur das Datum.
Wenn ich manuell folgendes ausführe: bash ~/bin/speedtest.zsh >> ~/speedtest.csv 2>&1
dann wird oben genanntes in der .csv abgespeichert
Und was steht im speedtest.zsh?
im speedtest.zsh steht das hier:
#!/bin/sh
echo “\”$(date -R)\”,$(python ~/scripts/speedtest.py –csv -s)”
hier gibt es auch dieses -s.
Was ich vorher vergessen hatte zu erwähnen ist, dass es bei mir den Speedtest am Anfang immer mit einer Fehlermeldung abgebrochen hatte und ich dann wie in den Kommentaren hier auf die aktuelle Version des Skriptes speedtest.py gewechselt habe.
Bei mir läuft das Python-Script an sich nicht mehr
: “Start tag expected, ‘<' not found, line 1, column 1". Ich denke ich muss den gesamten Beitrag grundsätzlich überarbeiten…
Ich habe das auf meinem Pi so eingerichtet. Bis vor Kurzem lief das auch ausgezeichnet. Seit einiger Zeit wird allerdings nur noch das Datum in die .csv geschrieben.
Wenn ich das Python-Skript manuell ausführe, erhalte ich folgende Meldung:
$ python ./speedtest.py
…
Loading server list…
Traceback (most recent call last):
File “./speedtest.py”, line 721, in
main(args)
File “./speedtest.py”, line 692, in main
uploadtests=args.uploadtests,
File “./speedtest.py”, line 157, in __init__
self.TestSpeed()
File “./speedtest.py”, line 633, in TestSpeed
self.server_list=self.LoadServers()
File “./speedtest.py”, line 412, in LoadServers
servers_xml = etree.fromstring(response.read())
File “src/lxml/lxml.etree.pyx”, line 3213, in lxml.etree.fromstring (src/lxml/lxml.etree.c:79003)
File “src/lxml/parser.pxi”, line 1848, in lxml.etree._parseMemoryDocument (src/lxml/lxml.etree.c:118334)
File “src/lxml/parser.pxi”, line 1736, in lxml.etree._parseDoc (src/lxml/lxml.etree.c:117014)
File “src/lxml/parser.pxi”, line 1102, in lxml.etree._BaseParser._parseDoc (src/lxml/lxml.etree.c:111258)
File “src/lxml/parser.pxi”, line 595, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:105102)
File “src/lxml/parser.pxi”, line 706, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:106810)
File “src/lxml/parser.pxi”, line 635, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:105664)
File “”, line 1
lxml.etree.XMLSyntaxError: Start tag expected, ‘<' not found, line 1, column 1
Ich nehme an, das legt an einem Python-Versionsupdate..
Das ist möglich. Derzeit scheint die Version 2.0.0 generell Probleme zu haben: https://github.com/sivel/speedtest-cli/issues/513. Version 1.0.7 funktioniert dabei (noch) einwandfrei.
Gibt es hier schon eine Lösung?
Bitte auf neuere Version (2.0.2) updaten & testen: https://github.com/sivel/speedtest-cli/releases
bei mir läuft das leider auch nicht….
speedtest an sich geht.
pi@bastel-pi:/opt/speedtest-cli $ ./speedtest.py
Retrieving speedtest.net configuration…
Testing from Deutsche Telekom AG (46.90.96.162)…
Retrieving speedtest.net server list…
Selecting best server based on ping…
Hosted by Cronon AG (Berlin) [12.67 km]: 30.74 ms
Testing download speed……………………………………………………………………..
Download: 41.21 Mbit/s
Testing upload speed……………………………………………………………………………………
Upload: 33.98 Mbit/s
pi@bastel-pi:/opt/tespeed $ ll /usr/bin/python2.7
-rwxr-xr-x 1 root root 3,1M Nov 24 2017 /usr/bin/python2.7
pi@bastel-pi:/opt/tespeed $ ll /usr/bin/python2
lrwxrwxrwx 1 root root 9 Jan 24 2017 /usr/bin/python2 -> python2.7
pi@bastel-pi:/opt/tespeed $ sudo python tespeed.py
Getting ready. Use parameter -h or –help to see available features.
Loading speedtest configuration…
IP: xxxx; Lat: 52.403300; Lon: 13.402100; ISP: Deutsche Telekom
Loading server list…
Traceback (most recent call last):
File “tespeed.py”, line 721, in
main(args)
File “tespeed.py”, line 692, in main
uploadtests=args.uploadtests,
File “tespeed.py”, line 157, in __init__
self.TestSpeed()
File “tespeed.py”, line 633, in TestSpeed
self.server_list=self.LoadServers()
File “tespeed.py”, line 412, in LoadServers
servers_xml = etree.fromstring(response.read())
File “src/lxml/lxml.etree.pyx”, line 3213, in lxml.etree.fromstring (src/lxml/lxml.etree.c:79003)
File “src/lxml/parser.pxi”, line 1848, in lxml.etree._parseMemoryDocument (src/lxml/lxml.etree.c:118334)
File “src/lxml/parser.pxi”, line 1736, in lxml.etree._parseDoc (src/lxml/lxml.etree.c:117014)
File “src/lxml/parser.pxi”, line 1102, in lxml.etree._BaseParser._parseDoc (src/lxml/lxml.etree.c:111258)
File “src/lxml/parser.pxi”, line 595, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:105102)
File “src/lxml/parser.pxi”, line 706, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:106810)
File “src/lxml/parser.pxi”, line 635, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:105664)
File “”, line 1
lxml.etree.XMLSyntaxError: Start tag expected, ‘<' not found, line 1, column 1
was genau das Problem ist weiß ich leider nicht 🙁
Warum rufst du “tespeed.py” direkt auf? Wie sieht dein Skript zur csv-Erstellung aus?
Hi smarthomebau,
naja ich bin deiner Anleitung gefolgt.
“Skripte runterladen (Autor: Jannis Jansons):
mkdir ~/scripts
wget https://raw.github.com/Janhouse/tespeed/master/tespeed.py -O ~/scripts/speedtest.py
Dieses Skript testet die Latenz zwischen den verfügbaren Mess-Servern und wählt den besten aus.
Test-Messung durchführen:
python ~/scripts/speedtest.py”
Da dieser Step noch nicht sauber klappte habe ich mich mit dem csv-File erstellen noch gar nicht weiter beschäftigt.
Und warum dieser Test nicht klappt habe ich noch nicht ganz verstanden. 🙁
Es gibt wohl zwischen verschiedenen Python-Versionen in seltenen Fällen Probleme mit HTTPS-Verbindungen. Wir hatten in letzter Zeit ganz gute Erfahrungen mit https://github.com/sivel/speedtest-cli gemacht. Wird relativ aktiv gepflegt/weiterentwickelt. Vielleicht ist das eine Alternative für dich. Die CSV-Erstellung folgt dann dem gleichen Muster.
Speedtest hat die Serverliste mit gzip komprimiert. Das “spendetest.py” versucht das gzip als xml zu lesen und scheitert.
Zeile 412 anpassen:
# Load etree from XML data
# servers_xml = etree.fromstring(response.read())
servers_xml = etree.fromstring(self.DecompressResponse(response))
Erste Zeile ist der Kommentar aus der speedtest.py zur Orientierung, die Originalzeile habe ich auskommentiert “#” und die angepasste Zeile hinzugefügt. Achtung: Passt auf mit der Einrückung (Blank vs. Tab)!
Hallo, ich weiß leider nicht ob es hier noch Support gibt.
Bei mir wird leider nichts ins file geschrieben.
folgende info kommt beim Ausführen des python Scripts:
python ~/scripts/speedtest.py
Getting ready. Use parameter -h or –help to see available features.
Loading speedtest configuration…
IP: 194.96.60.242; Lat: 47.076400; Lon: 15.360500; ISP: Telekom Austria
Loading server list…
Traceback (most recent call last):
File “/home/pi/scripts/speedtest.py”, line 724, in
main(args)
File “/home/pi/scripts/speedtest.py”, line 695, in main
uploadtests=args.uploadtests,
File “/home/pi/scripts/speedtest.py”, line 160, in __init__
self.TestSpeed()
File “/home/pi/scripts/speedtest.py”, line 636, in TestSpeed
self.server_list=self.LoadServers()
File “/home/pi/scripts/speedtest.py”, line 415, in LoadServers
servers_xml = etree.fromstring(response.read())
File “/usr/lib/python2.7/xml/etree/ElementTree.py”, line 1300, in XML
parser.feed(text)
File “/usr/lib/python2.7/xml/etree/ElementTree.py”, line 1642, in feed
self._raiseerror(v)
File “/usr/lib/python2.7/xml/etree/ElementTree.py”, line 1506, in _raiseerror
raise err
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 1, column 0
Danke!
LG
Hallo,
ich möchte ebenfalls eine repräsentative Messung durchführen. Leider bekomme ich keine Daten angezeigt. Folgendes wir mir angezeigt wenn ich den Befehl “python ~/scripts/speedtest.py” ausführe
Getting ready. Use parameter -h or –help to see available features.
Loading speedtest configuration…
IP: XXXXXXXXXX; Lat: 52.337200; Lon: 13.412100; ISP: Vodafone Kabel Deutschland
Loading server list…
Traceback (most recent call last):
File “/home/pi/scripts/speedtest.py”, line 720, in
main(args)
File “/home/pi/scripts/speedtest.py”, line 691, in main
uploadtests=args.uploadtests,
File “/home/pi/scripts/speedtest.py”, line 156, in __init__
self.TestSpeed()
File “/home/pi/scripts/speedtest.py”, line 632, in TestSpeed
self.server_list=self.LoadServers()
File “/home/pi/scripts/speedtest.py”, line 411, in LoadServers
servers_xml = etree.fromstring(response.read())
File “src/lxml/lxml.etree.pyx”, line 3213, in lxml.etree.fromstring (src/lxml/lxml.etree.c:79003)
File “src/lxml/parser.pxi”, line 1848, in lxml.etree._parseMemoryDocument (src/lxml/lxml.etree.c:118334)
File “src/lxml/parser.pxi”, line 1736, in lxml.etree._parseDoc (src/lxml/lxml.etree.c:117014)
File “src/lxml/parser.pxi”, line 1102, in lxml.etree._BaseParser._parseDoc (src/lxml/lxml.etree.c:111258)
File “src/lxml/parser.pxi”, line 595, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:105102)
File “src/lxml/parser.pxi”, line 706, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:106810)
File “src/lxml/parser.pxi”, line 635, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:105664)
File “”, line 1
lxml.etree.XMLSyntaxError: Start tag expected, ‘<' not found, line 1, column 1
Wo liegt der Fehler?
Gruß Benja
[…] Erster Beitrag zur Internet-Geschwindigkeitsmessung ist auf sehr viel Zuspruch gestoßen – die dort beschriebene Vorgehensweise ist nun etwas in […]