Speedtest: Unterschied zwischen den Versionen

Aus FHEMWiki
 
(10 dazwischenliegende Versionen von 6 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{SEITENTITEL:speedtest}}
{{Infobox Modul
{{Infobox Modul
|ModPurpose=Testet die Internetgeschwindigkeit
|ModPurpose=Testet die Internetgeschwindigkeit
Zeile 7: Zeile 6:
|ModTechName=32_speedtest.pm
|ModTechName=32_speedtest.pm
|ModOwner=Andre / justme1968 ({{Link2FU|430|Forum}} / [[Benutzer_Diskussion:Justme|Wiki]])}}
|ModOwner=Andre / justme1968 ({{Link2FU|430|Forum}} / [[Benutzer_Diskussion:Justme|Wiki]])}}
[[Speedtest]] ist ein Modul, mit dem in regelmäßigen Abständen die Internet-Geschwindigket (Download, Upload, Ping) gemessen werden kann. Dabei wird auf das externe Python-Script [https://github.com/sivel/speedtest-cli speedtest-cli] zurückgegriffen.


__TOC__
Mit dem Stand vom 05.10.2020 kann alternativ auch das offizielle CLI Binary von ookla verwendet werden. Dies liefert in der Regel genauere Werte, vor allem bei höheren Bandbreiten.   
{{Todo|Fehlerkontrolle, Formatierung, Ergänzung, ggf. Detaillieren des Troubleshooting}}
 
[[Speedtest]] ist ein Modul um mit Hilfe des externen Python-Scripts speedtest-cli die Internetgeschwindigkeit zu testen.  
 
== Features / Funktionen ==
Mit Hilfe des Moduls kann in regelmäßigen Abständen die Internetgeschwindigkeit (download, upload, ping) bestimmt werden. Dabei wird auf das Pythonscript speedtest-cli (siehe [[speedtest#Weblinks|Weblinks]]) zurückgegriffen. Es lässt sich das Intervall, der genaue Server, gegen den getestet werden soll, sowie eine bestimmte Anzahl an Testläufen festlegen.
 
== Definition ==
 
Das Modul wird folgendermaßen definiert:
<pre>
define <name> speedtest [<interval> [<server>]]
</pre>
 
=== Optionen ===
 
Die Angabe des Intervals ist optional. Der Defaultwert ohne Angabe des Intervalls ist 3600 Sekunden. Die Daten werden alle <interval> Sekunden aktualisiert. Das Minimum ist 1800 Sekunden.
 
Die Angabe des Servers ist ebenfalls optional. Der Defaultwert ohne Angabe ist der per ping "nächstgelegene" Server. Über die Option <server> kann ein dedizierter speedtest Server festgelegt werden, gegen den die Geschwindigkeit ermittelt wird.
   
Eine Liste lässt sich auf der Kommandozeile über den folgenden Aufruf auslesen:
<pre>
speedtest-cli --list
</pre>
 
; Readings
Als readings werden Werte für ping in ms, download-/upload-Geschwindigkeiten in Mbit/s zur Verfügung gestellt.
 
; Manuelle Abfrage
Ein Test lässt sich über ein <code>set speedtest statusRequest</code> manuell anstoßen.
 
=== Attribute ===
Bei der Definition des Moduls können folgende Attribute gesetzt werden
 
; path
Hier kann der Pfad zum Script angegeben werden. Im unten gegebenen Fall wäre das /usr/local/bin.
 
; checks-till-disable
Über dieses Attribut lässt sich festlegen, wie häufig speedtest ausgeführt werden soll, bevor der automatische Aufruf deaktiviert wird. Nach Ablauf des Zählers wird das Modul automatisch auf disable gesetzt. Bei jedem Durchlauf wird der Zähler um 1 reduziert.
 
; disable
Ist dieses Attribut auf 1 gesetzt, ist die automatische Ausführung deaktiviert. Das manuelle Ausführen über set ist trotzdem möglich.


== Voraussetzungen ==
== Voraussetzungen ==
 
Für diese Anleitung ist notwendig:
Für diese Anleitung ist notwendig
* Debian-Derivat (Debian, Ubuntu, Raspbian, ...)
* Wissen, wie man mit der Kommandozeile umgeht und Linuxgrundkenntnisse
* Linux-Grundkenntnisse
* Paket- und Quellenverwaltung apt-get
* Paket- und Quellenverwaltung apt-get
* wget


Alle in diesen Kapitel genannten Befehle müssen auf der Kommandozeile abgesetzt werden.
Alle in diesen Kapitel genannten Befehle müssen auf der Kommandozeile abgesetzt werden.


=== Python ===
=== Installation von speedtest-cli ===
 
Voraussetzung:
Entsprechend Quelle des Scripts ist eine Python-Version zwischen 2.4 - 3.4 erforderlich.
* Python 2.4 - 3.4
Um herauszufinden, welche Python-Version installiert ist, reicht ein Aufruf auf der Kommandozeile von
{{Hinweis|Sollte [https://www.python.org/ Python] und/oder [https://www.gnu.org/software/wget/ wget] nicht installiert sein, kann das mit folgenden zwei Befehlen erledigt werden:
<pre>
sudo apt-get update
python -V
sudo apt-get install python wget
</pre>
}}
Zuerst muss das speedtest-cli - Script heruntergeladen werden. Der folgende Befehl erledigt das mit Hilfe von wget und speichert die Datei im Verzeichnis ''/usr/local/bin'':
sudo wget -O /usr/local/bin/speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py


Ist eine Version kleiner als 2.4 installiert, sollte ein Update über z.B. folgende Befehle Abhilfe schaffen (liest die aktuelle Paketliste ein):
Anschließend muss die Datei noch als "ausführbar" markiert werden:
<pre>
sudo chmod +x /usr/local/bin/speedtest-cli
sudo apt-get update
</pre>
 
Der folgende Aufruf aktualisiert alle installierten Pakete auf die derzeit aktuellste Version:
<pre>
sudo apt-get upgrade
</pre>
 
Bekommt man eine Fehlermeldung mit dem Hinweis, dass Python nicht installiert sei, muss dieses entsprechend Platform installiert werden, z.B. über folgenden Befehl:
<pre>
sudo apt-get install python
</pre>


=== speedtest-cli ===
Ob alles funktioniert hat, kann man dann mit einem einfachen Aufruf überprüfen:
speedtest-cli --help


Der Download lässt sich über wget ODER github oder diverse andere Möglichkeiten bewerkstelligen. Entsprechende Pakete müssen auf dem System installiert sein. Falls nicht, muss man diese über einen der beiden Befehle installieren:
Weitere Installationsanleitungen sind auf der [https://github.com/sivel/speedtest-cli speedtest-cli - Webseite] zu finden.
<pre>
sudo apt-get install wget
</pre>
<pre>
sudo apt-get install git
</pre>


Damit man den Download nicht irgendwo auf seinem System herunterlädt, ist empfehlenswert, zunächst in sein eigenes Homeverzeichnis zu wechseln:
=== Installation des CLI Binary von ookla ===
<pre>
cd ~
</pre>


Um keine Dateileichen zu hinterlassen, empfiehlt es sich darüber hinaus, NACH erfolgreicher Installation aufzuräumen und alles was man hierher heruntergeladen hat, gleich zu löschen.
Entweder das offizielle Setup Script von ookla verwenden: https://www.speedtest.net/apps/cli, oder das für die Hardware passende CLI Binary von direkt herunterladen und auspacken.


==== Wget ====
Beispiel für '''RasperryPi''':
* <code> wget -O speedtest.tgz <nowiki>https://install.speedtest.net/app/cli/ookla-speedtest-1.1.1-linux-armhf.tgz</nowiki></code>
* <code> tar -xzvf speedtest.tgz</code>
* <code>mv speedtest /usr/local/bin/</code>


Im eigenen Homeverzeichnis führt man den folgenden Befehl aus, um speedtest-cli herunterzuladen. Dieser läd das Script herunter und speichert es am Ort des Ausführens unter speedtest-cli:
und setzen des Attributs <code>ookla</code> mit dem Wert 1.
<pre>
wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest_cli.py
</pre>  


Damit das Script ausführbar ist, müssen die Berechtigungen entsprechend gesetzt werden:
Falls damit der folgende Fehler im FHEM-Log angezeigt wird
<pre>
<pre>
chmod +x speedtest-cli
2020.10.07 11:52:14.721 5: speedtest done
  what():  basic_string::_M_construct null not valid
terminate called after throwing an instance of 'std::logic_error'
</pre>
</pre>
muss das FHEM-Start -Script angepasst werden. Beispiel in {{Link2Forum|Topic=114118|Message=1090706|LinkText=diesem Forenbeitrag}}.


Anschließend wird es an eine passende Stelle im System verschoben, z.B. in den Ordner /usr/local/bin:
== Definition ==
<pre>
Das Modul wird folgendermaßen definiert:
sudo mv speedtest-cli /usr/local/bin
define <name> speedtest [interval] [server]
</pre>


==== Github ====
=== Optionen ===
*<code><interval></code>: Optional. Der Wert bestimmt, in welchen Zeitabständen ein Geschwindigkeitstest durchgeführt wird. Wird kein Intervall angegeben, wird der Standard-Wert (3600s) verwendet. Minimum sind 1800 Sekunden.
*<code><server></code>: Optional. Hier kann die ID eines Speedtest-Servers eingetragen werden, gegen den die Geschwindigkeits-Tests gefahren werden. Ist kein Wert angegeben, wird der "nächstgelegene" Server verwendet.
{{Hinweis|Eine Liste aller verfügbaren Speedtest-Server kann mittels <code>speedtest-cli --list</code> bzw. <code>speedtest-cli --list {{!}} grep Germany</code> angezeigt werden}}


Mit folgendem Aufruf lässt sich das Paket herunterladen. Dabei wird ein passendes neues Unterverzeichnis angelegt und das Heruntergeladene darin entpackt.
=== Readings ===
<pre>
* <code>ping</code> (ms)
git clone https://github.com/sivel/speedtest-cli.git
* <code>download</code> (MBit/s)
</pre>
* <code>upload</code> (MBit/s)


Das Script liegt hier bereits ausführbar als speedtest_cli.py im Unterordner und muss an einen passenden Ort kopiert werden. Dabei ist wichtig, dass das Modul den Namen <code>speedtest-cli</code> erwartet.
=== Set ===
<pre>
* <code>statusRequest</code>: Startet einen manuellen Durchlauf des definierten Tests
sudo cp ./speedtest-cli/speedtest_cli.py /usr/local/bin/speedtest-cli
</pre>
 
=== Test des Scripts ===
 
Ob das Script funktioniert, lässt sich über folgenden Aufruf testen:
<pre>
/usr/local/bin/speedtest-cli
</pre>
 
Detaillierte Informationen zu den Optionen beim Aufruf sind auf der Quell-Seite dokumentiert [[Speedtest#Weblinks|Weblinks]].


=== Attribute ===
Bei der Definition des Moduls können folgende Attribute gesetzt werden:
* <code>path</code>: Hier kann das Verzeichnis des speedtest-cli-Scripts angegeben werden (z.B.: /usr/local/bin).
* <code>checks-till-disable</code>: Über dieses Attribut lässt sich festlegen, wie häufig speedtest-cli ausgeführt werden soll, bevor der automatische Aufruf deaktiviert wird. Nach Ablauf des Zählers wird das Modul automatisch auf disable gesetzt. Bei jedem Durchlauf wird der Zähler um 1 reduziert.
* <code>disable</code>: Ist dieses Attribut auf 1 gesetzt, ist die automatische Ausführung deaktiviert. Das manuelle Ausführen über <code>set</code> ist trotzdem möglich.
* <code>ookla</code>: Ist dieses Attribut auf 1 gesetzt, wird das CLI Binary von ookla verwendet.
== Beispiel ==
== Beispiel ==
(Bearbeitung über die Weboberfläche von FHEM und "edit files" oder direkte Eingabe in die FHEM-Befehlszeile)
[[File:speedtest01.png|mini|right|200px|Ein speedtest-Device nach dem Geschwindigkeits-Test]]


=== Definition des Moduls ===
=== Definition des Moduls ===
<pre>
<syntaxhighlight lang="perl">
define speedtest speedtest 1800 5255
define MySpeedtest speedtest 1800 5255
attr speedtest path /usr/local/bin
attr MySpeedtest path /usr/local/bin
</pre>
</syntaxhighlight>


=== Logging in eine Datei ===
=== Logging in eine Datei ===
Das Speichern der Ergebnisse in ein Logfile erreicht man z.B. so:
<syntaxhighlight lang="perl">
define FileLog_MySpeedtest FileLog ./log/MySpeedtest-%Y%m.log MySpeedtest:.*
attr FileLog_MySpeedtest logtype text
</syntaxhighlight>


Das loggen der Daten in eine Datei sähe z.B. so aus.
==== Plot (FileLog)====
<pre>
Ein zugehörige SVG-Plot könnte wie folgt aussehen:
define FileLog_speedtest FileLog ./log/speedtest-%Y.log speedtest:.*
<syntaxhighlight lang="perl">
attr FileLog_speedtest logtype text
</pre>
 
Definition der Datei speedtest3.gplots:
<pre>
############################
############################
# Display speedtest results
# Display speedtest results
Zeile 183: Zeile 125:
     using 1:2 ls l1 axes x1y1 title 'upload (Mbit/s)' with lines,
     using 1:2 ls l1 axes x1y1 title 'upload (Mbit/s)' with lines,
     using 1:2 ls l2 axes x1y3 title 'ping (ms)' with lines
     using 1:2 ls l2 axes x1y3 title 'ping (ms)' with lines
</pre>
</syntaxhighlight>


Der Weblink wird wie folgt definiert:
Der Weblink dazu wird wie folgt definiert:
<pre>
<syntaxhighlight lang="perl">
define wl_speedtest SVG FileLog_speedtest:speedtest3:CURRENT
define wl_speedtest SVG FileLog_speedtest:speedtest3:CURRENT
</pre>
</syntaxhighlight>
 
=== Logging mit Hilfe von DbLog ===


Das loggen in die Datenbank erfolgt, wenn die Readings explizit oder generell alle Readings bei der Definition von DbLog angegeben worden sind und bei der Definition des Moduls speedtest die Readings nicht über DbLogExclude ausgeschlossen wurden.
=== Logging mit Hilfe von [[DbLog]] ===
Das Loggen in eine Datenbank erfolgt, wenn ein Reading explizit oder generell alle Readings bei der Definition von [[DbLog]] angegeben worden sind und bei der Definition des Moduls [[Speedtest]] die Readings nicht über ''DbLogExclude'' ausgeschlossen wurden.


Definition des Plots bei Verwendung von DbLog
==== Plot (DbLog) ====
<pre>
Definition des Plots bei Verwendung von DbLog:
<syntaxhighlight lang="perl">
define wl_speedtest SVG myDbLog:speedtest:HISTORY
define wl_speedtest SVG myDbLog:speedtest:HISTORY
attr wl_speedtest label "DL $data{currval1} / UL $data{currval2} / ping $data{currval3}"
attr wl_speedtest label "DL $data{currval1} / UL $data{currval2} / ping $data{currval3}"
attr wl_speedtest plotfunction speedtest
attr wl_speedtest plotfunction speedtest
</pre>
</syntaxhighlight>
 


Definition der Datei speedtest.gplots:
Definition der Datei speedtest.gplots:
<pre>
<syntaxhighlight lang="perl">
############################
############################
# Display speedtest results
# Display speedtest results
Zeile 230: Zeile 171:
     using 1:2 ls l1 axes x1y1 title 'upload (Mbit/s)' with lines,
     using 1:2 ls l1 axes x1y1 title 'upload (Mbit/s)' with lines,
     using 1:2 ls l2 axes x1y3 title 'ping (ms)' with lines
     using 1:2 ls l2 axes x1y3 title 'ping (ms)' with lines
</pre>
</syntaxhighlight>


== Bekannte Probleme ==
== Bekannte Probleme ==
* Für den Betrieb ist Python notwendig. Daher läuft das Script nicht ohne Weiteres auf einer Fritzbox.
* Für den Betrieb ist Python notwendig. Daher läuft das Script nicht ohne Weiteres auf einer FritzBox.
* Vor ein paar Tagen (28.02.2015) gab es ein paar Fehlermeldungen, die sich nach der Aktualisierung des Scripts aber bislang wieder erübrigt haben.
* Zwischenzeitlich wurde das Script umbenannt. Das Modul erwartet nach wie vor den ursprünglichen Namen. Daher ist wie oben beschrieben darauf zu achten, dass das abgelegte Script <code>speedtest-cli</code> heißt und notfalls dementsprechend umbenannt wird.
* Zwischenzeitlich wurde das Script umbenannt. Das Modul erwartet nach wie vor den ursprünglichen Namen. Daher ist wie oben beschrieben darauf zu achten, dass das abgelegte Script <code>speedtest-cli</code> heißt und zur Not dahingehend umbenannt wird.
* Das Modul bricht ggf. mit einer Perl-Fehlermeldung im FHEM-Log ab, obwohl das Script von der Konsole aus einwandfrei läuft. Dies tritt z.B. bei Verwendung von Rasbian mit installierten Python 2.7 und Python 3 auf. Zur Behebung muss im Script <code>speedtest-cli</code> die erste Zeile auf <code>#!/usr/bin/env python'''3'''</code> geändert werden.
* Das Modul bricht ggf. mit einer Perl-Fehlermeldung im Fhem-Log ab, obwohl das Script <code>speedtest-cli</code> von der Konsole aus einwandfrei läuft. Dies tritt z.B. bei Verwendung von Rasbian mit installierten Python2.7 und Python3 auf. Zur Behebung muss im Script <code>speedtest-cli</code> die erste Zeile auf <code>#!/usr/bin/env python'''3'''</code> geändert werden.
* Auf manchen Systemen muss in aktuellen speedtest-cli Versionen die Zeile <code>'(%s; U; %s; en-us)' % (platform.system(), platform.architecture()[0]),</code> auskommentiert werden.
* Auf manchen Systemen muß in aktuellen speedtest-cli Versionen die Zeile
:<code>'(%s; U; %s; en-us)' % (platform.system(), platform.architecture()[0]),</code>  
:auskommentiert werden.


== Troubleshooting ==
== Troubleshooting ==
Im Folgenden sind ein paar Ansatzpunkte genannt, um beim Troubleshooting zu unterstützen.
Im Folgenden sind ein paar Ansatzpunkte genannt, um beim Troubleshooting zu unterstützen:
 
* Das Script läuft auf der Kommandzeile problemlos, das Modul bringt aber Fehler:
; Läuft das Script beim Aufruf auf der Kommandozeile?
** Script ist nicht ausführbar (<code>chmod +x speedtest-cli</code>)
* Es könnte am fehlenden oder einer falschen Version von Python liegen.
** Der FHEM-User (''fhem'') hat keine Berechtigung das Script auszuführen
* Ist das Script ausführbar?
<!--
* Hat man selbst bzw. die FHEM-Instanz ausreichend Berechtigungen, das Script auszuführen?
 
 
; Ist das Log frei von Fehlermeldungen?
; Ist das Log frei von Fehlermeldungen?
; Werden im Modul Readings angezeigt?
; Werden im Modul Readings angezeigt?
; Kommen die Readings im Log (Filelog oder DbLog) an?
; Kommen die Readings im Log (Filelog oder DbLog) an?
 
-->
 
* SVG-Plot zeigt nichts an:
 
** Verweis auf Filelog oder DbLog falsch
; Ist die Definition von SVG korrekt?
** Falsches gplot-File angegeben
* Richtiger Verweis auf Filelog oder DbLog
** Übergabe der Plotfunktion (bei DbLog) nicht korrekt
* Angabe des richtigen gplot-Files
** Falsche Groß-/Kleinschreibung verwendet (case sensitive)
* Übergabe der Plotfunktion (bei DbLog)
<!--
* Die der Syntax korrekt (case sensitive)
* Ist der Inhalt des gplot-Files korrekt
 
 
; Ist der Inhalt des gplot-Files korrekt
* Ist die Definition der Quelle korrekt (Filelog, DbLog oder LogProxy)?
* Ist die Definition der Quelle korrekt (Filelog, DbLog oder LogProxy)?
* Ist die Regexpr korrekt?
* Ist die Regexpr korrekt?
 
-->
 
* Fehlermeldung ''isn't numeric in sprintf at ./FHEM/98_SVG.pm''
; Fehlermeldung "isn't numeric in sprintf at ./FHEM/98_SVG.pm"
** Dieses kommt grundsätzlich immer dann vor, wenn SVG versucht einen Wert einzulesen, der neben der Zahl auch die Einheit enthält. Dieses kann bei der Verwendung von DbLog vorkommen, weil DbLog nicht weiß, wie es Wert und Einheit trennen soll. Abhilfe schafft eine entsprechende Regular Expression, die nur den Zahlenwert liefert.
* Dieses kommt grundsätzlich immer dann vor, wenn SVG versucht einen Wert einzulesen, der neben der Zahl auch die Einheit enthält. Dieses kann bei der Verwendung von DbLog (DbLog ist nicht bekannt, wo es bei dem geloggten Modul die Einheit abtrennen soll) oder addlog vorkommen. Abhilfe liefert eine entsprechende Regexpr, die nur den Zahlenwert verwendet.


== Weblinks ==
== Weblinks ==
* Beschreibung des Scripts [http://binarynature.blogspot.de/2013/03/measure-internet-connection-speed-from-linux-command-line.html binarynature.blogspot.de]
* Beschreibung des Scripts [http://binarynature.blogspot.de/2013/03/measure-internet-connection-speed-from-linux-command-line.html binarynature.blogspot.de]
* Quelle des Scripts [https://pypi.python.org/pypi/speedtest-cli pypi.python.org]
* [https://pypi.python.org/pypi/speedtest-cli speedtest-cli auf pypi.python.org]
* Quelle des Scripts [https://github.com/sivel/speedtest-cli github.com]
* [https://github.com/sivel/speedtest-cli speedtest-cli auf github.com]
* Forumseintrag über die Entwicklung des Moduls [http://forum.fhem.de/index.php/topic,13419.msg83189.html#msg83189 Thema: Internetgeschwindigkeit überwachen]
* Forumseintrag über die Entwicklung des Moduls {{Link2Forum|Topic=13419|Message=83189|LinkText=Thema: Internetgeschwindigkeit überwachen}}
* Forumseintrag darüber, dass das Binary nicht auf der Fritzbox läuft [http://forum.fhem.de/index.php/topic,27242.msg201516.html#msg201516 Thema: Internetgeschwindigkeit - speedtest]
* Forumseintrag darüber, dass das Binary nicht auf der Fritzbox läuft {{Link2Forum|Topic=27242|Message=201516|LinkText=Thema: Internetgeschwindigkeit - speedtest}}
* Forumseintrag über aus der Idee wird ein Modul [http://forum.fhem.de/index.php/topic,13483.msg83538.html#msg83538 Thema: Internetgeschwindigkeit überwachen]
* Forumseintrag über aus der Idee wird ein Modul {{Link2Forum|Topic=13483|Message=83538|LinkText=Thema: Internetgeschwindigkeit überwachen}}
* Forumsbeitrag zum Einsatz unter Windows {{Link2Forum|Topic= 111602|LinkText=Thema: Speedtest für windows}}


== sonstiges ==
== Sonstiges ==
Besten Dank an wkarl, Puschel74, justme1968 für Idee, Modulerstellung/Pflege und Installationsanleitung.
Besten Dank an wkarl, Puschel74, justme1968 für Idee, Modulerstellung/Pflege und Installationsanleitung.

Aktuelle Version vom 8. August 2022, 17:32 Uhr

speedtest
Zweck / Funktion
Testet die Internetgeschwindigkeit
Allgemein
Typ Gerätemodul
Details
Dokumentation EN / DE
Support (Forum) Sonstiges
Modulname 32_speedtest.pm
Ersteller Andre / justme1968 (Forum / Wiki)
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!

Speedtest ist ein Modul, mit dem in regelmäßigen Abständen die Internet-Geschwindigket (Download, Upload, Ping) gemessen werden kann. Dabei wird auf das externe Python-Script speedtest-cli zurückgegriffen.

Mit dem Stand vom 05.10.2020 kann alternativ auch das offizielle CLI Binary von ookla verwendet werden. Dies liefert in der Regel genauere Werte, vor allem bei höheren Bandbreiten.

Voraussetzungen

Für diese Anleitung ist notwendig:

  • Debian-Derivat (Debian, Ubuntu, Raspbian, ...)
  • Linux-Grundkenntnisse
  • Paket- und Quellenverwaltung apt-get
  • wget

Alle in diesen Kapitel genannten Befehle müssen auf der Kommandozeile abgesetzt werden.

Installation von speedtest-cli

Voraussetzung:

  • Python 2.4 - 3.4
Info blue.png
Sollte Python und/oder wget nicht installiert sein, kann das mit folgenden zwei Befehlen erledigt werden:
sudo apt-get update
sudo apt-get install python wget


Zuerst muss das speedtest-cli - Script heruntergeladen werden. Der folgende Befehl erledigt das mit Hilfe von wget und speichert die Datei im Verzeichnis /usr/local/bin:

sudo wget -O /usr/local/bin/speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py

Anschließend muss die Datei noch als "ausführbar" markiert werden:

sudo chmod +x /usr/local/bin/speedtest-cli

Ob alles funktioniert hat, kann man dann mit einem einfachen Aufruf überprüfen:

speedtest-cli --help

Weitere Installationsanleitungen sind auf der speedtest-cli - Webseite zu finden.

Installation des CLI Binary von ookla

Entweder das offizielle Setup Script von ookla verwenden: https://www.speedtest.net/apps/cli, oder das für die Hardware passende CLI Binary von direkt herunterladen und auspacken.

Beispiel für RasperryPi:

  • wget -O speedtest.tgz https://install.speedtest.net/app/cli/ookla-speedtest-1.1.1-linux-armhf.tgz
  • tar -xzvf speedtest.tgz
  • mv speedtest /usr/local/bin/

und setzen des Attributs ookla mit dem Wert 1.

Falls damit der folgende Fehler im FHEM-Log angezeigt wird

2020.10.07 11:52:14.721 5: speedtest done
  what():  basic_string::_M_construct null not valid
terminate called after throwing an instance of 'std::logic_error'

muss das FHEM-Start -Script angepasst werden. Beispiel in diesem Forenbeitrag.

Definition

Das Modul wird folgendermaßen definiert:

define <name> speedtest [interval] [server]

Optionen

  • <interval>: Optional. Der Wert bestimmt, in welchen Zeitabständen ein Geschwindigkeitstest durchgeführt wird. Wird kein Intervall angegeben, wird der Standard-Wert (3600s) verwendet. Minimum sind 1800 Sekunden.
  • <server>: Optional. Hier kann die ID eines Speedtest-Servers eingetragen werden, gegen den die Geschwindigkeits-Tests gefahren werden. Ist kein Wert angegeben, wird der "nächstgelegene" Server verwendet.


Info blue.png
Eine Liste aller verfügbaren Speedtest-Server kann mittels speedtest-cli --list bzw. speedtest-cli --list | grep Germany angezeigt werden


Readings

  • ping (ms)
  • download (MBit/s)
  • upload (MBit/s)

Set

  • statusRequest: Startet einen manuellen Durchlauf des definierten Tests

Attribute

Bei der Definition des Moduls können folgende Attribute gesetzt werden:

  • path: Hier kann das Verzeichnis des speedtest-cli-Scripts angegeben werden (z.B.: /usr/local/bin).
  • checks-till-disable: Über dieses Attribut lässt sich festlegen, wie häufig speedtest-cli ausgeführt werden soll, bevor der automatische Aufruf deaktiviert wird. Nach Ablauf des Zählers wird das Modul automatisch auf disable gesetzt. Bei jedem Durchlauf wird der Zähler um 1 reduziert.
  • disable: Ist dieses Attribut auf 1 gesetzt, ist die automatische Ausführung deaktiviert. Das manuelle Ausführen über set ist trotzdem möglich.
  • ookla: Ist dieses Attribut auf 1 gesetzt, wird das CLI Binary von ookla verwendet.

Beispiel

Ein speedtest-Device nach dem Geschwindigkeits-Test

Definition des Moduls

define MySpeedtest speedtest 1800 5255
attr MySpeedtest path /usr/local/bin

Logging in eine Datei

Das Speichern der Ergebnisse in ein Logfile erreicht man z.B. so:

define FileLog_MySpeedtest FileLog ./log/MySpeedtest-%Y%m.log MySpeedtest:.*
attr FileLog_MySpeedtest logtype text

Plot (FileLog)

Ein zugehörige SVG-Plot könnte wie folgt aussehen:

############################
# Display speedtest results

set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<L1>'

set yrange [0:1]
set y2range [0:12]
set y3range [0:120]

set ylabel "Mbit/s"
set y2label "Mbit/s"
set y3label "ms"

#FileLog 4:speedtest.download\x3a::
#FileLog 4:speedtest.upload\x3a::
#FileLog 4:speedtest.ping\x3a::

plot
     using 1:2 ls l0 axes x1y2 title 'download (Mbit/s)' with lines,
     using 1:2 ls l1 axes x1y1 title 'upload (Mbit/s)' with lines,
     using 1:2 ls l2 axes x1y3 title 'ping (ms)' with lines

Der Weblink dazu wird wie folgt definiert:

define wl_speedtest SVG FileLog_speedtest:speedtest3:CURRENT

Logging mit Hilfe von DbLog

Das Loggen in eine Datenbank erfolgt, wenn ein Reading explizit oder generell alle Readings bei der Definition von DbLog angegeben worden sind und bei der Definition des Moduls Speedtest die Readings nicht über DbLogExclude ausgeschlossen wurden.

Plot (DbLog)

Definition des Plots bei Verwendung von DbLog:

define wl_speedtest SVG myDbLog:speedtest:HISTORY
attr wl_speedtest label "DL $data{currval1} / UL $data{currval2} / ping $data{currval3}"
attr wl_speedtest plotfunction speedtest

Definition der Datei speedtest.gplots:

############################
# Display speedtest results

set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<L1>'

set yrange [0:1]
set y2range [0:12]
set y3range [0:120]

set ylabel "Mbit/s"
set y2label "Mbit/s"
set y3label "ms"

#myDbLog <SPEC1>:download:::$val=~s/([\d.]*).*/$1/eg
#myDbLog <SPEC1>:upload:::$val=~s/([\d.]*).*/$1/eg
#myDbLog <SPEC1>:ping:::$val=~s/([\d.]*).*/$1/eg

plot
     using 1:2 ls l0 axes x1y2 title 'download (Mbit/s)' with lines,
     using 1:2 ls l1 axes x1y1 title 'upload (Mbit/s)' with lines,
     using 1:2 ls l2 axes x1y3 title 'ping (ms)' with lines

Bekannte Probleme

  • Für den Betrieb ist Python notwendig. Daher läuft das Script nicht ohne Weiteres auf einer FritzBox.
  • Zwischenzeitlich wurde das Script umbenannt. Das Modul erwartet nach wie vor den ursprünglichen Namen. Daher ist wie oben beschrieben darauf zu achten, dass das abgelegte Script speedtest-cli heißt und notfalls dementsprechend umbenannt wird.
  • Das Modul bricht ggf. mit einer Perl-Fehlermeldung im FHEM-Log ab, obwohl das Script von der Konsole aus einwandfrei läuft. Dies tritt z.B. bei Verwendung von Rasbian mit installierten Python 2.7 und Python 3 auf. Zur Behebung muss im Script speedtest-cli die erste Zeile auf #!/usr/bin/env python3 geändert werden.
  • Auf manchen Systemen muss in aktuellen speedtest-cli Versionen die Zeile '(%s; U; %s; en-us)' % (platform.system(), platform.architecture()[0]), auskommentiert werden.

Troubleshooting

Im Folgenden sind ein paar Ansatzpunkte genannt, um beim Troubleshooting zu unterstützen:

  • Das Script läuft auf der Kommandzeile problemlos, das Modul bringt aber Fehler:
    • Script ist nicht ausführbar (chmod +x speedtest-cli)
    • Der FHEM-User (fhem) hat keine Berechtigung das Script auszuführen
  • SVG-Plot zeigt nichts an:
    • Verweis auf Filelog oder DbLog falsch
    • Falsches gplot-File angegeben
    • Übergabe der Plotfunktion (bei DbLog) nicht korrekt
    • Falsche Groß-/Kleinschreibung verwendet (case sensitive)
  • Fehlermeldung isn't numeric in sprintf at ./FHEM/98_SVG.pm
    • Dieses kommt grundsätzlich immer dann vor, wenn SVG versucht einen Wert einzulesen, der neben der Zahl auch die Einheit enthält. Dieses kann bei der Verwendung von DbLog vorkommen, weil DbLog nicht weiß, wie es Wert und Einheit trennen soll. Abhilfe schafft eine entsprechende Regular Expression, die nur den Zahlenwert liefert.

Weblinks

Sonstiges

Besten Dank an wkarl, Puschel74, justme1968 für Idee, Modulerstellung/Pflege und Installationsanleitung.