Es gibt einen neuen Artikel zum Thema Speedtest mit OpenHAB – neu
Heute habe ich mich auf die Suche gemachte wie ich einen automatischen Speedtest in mein OpenHAB integrieren kann. Auf der Suche bin ich hier über den Beitrag in der OpenHAB Community gestoßen.
Es funktionierte auch alles so weit, nur der gemessene Upload war sehr langsam. Nach weiterem Suchen bin ich darauf gestoßen dass es möglicherweise an der Art wie ich speedtest-cli installiert habe. Nämlich über apt-get. Nun habe ich das python Script wie hier beschrieben geladen und ausführbar gemacht.
wget https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py chmod +x speedtest.py
Danach das Script einmal testen
speedtest.py
Nun muss man sich einen Server aus der Liste aussuchen weil die Auswertung im folgenden auf Grund unterschiedlicher Server-Namen nicht funktioniert
speedtest.py --list | grep "Germany"
Aus der Liste sucht man sich einen Server aus. Ich nehme einaml 4997
speedtest.py --server 4997 Retrieving speedtest.net configuration... Testing from Vodafone Kabel Deutschland (XXX.XXX.XXX.XXX)... Retrieving speedtest.net server list... Retrieving information for the selected server... Hosted by inexio (Saarlouis) [XX.XX km]: 51.842 ms Testing download speed................................................................................ Download: 154.99 Mbit/s Testing upload speed................................................................................................ Upload: 37.84 Mbit/s
Abhängig vom Server-Namen muss man dann den Split für den Ping machen und auch die richtigen Zeilen wählen (Siehe hier Code-Zeile 25,26 und 27). Bei mir ist es der 6. Teil der Textzeile 4 für den Ping sowie die Zeilen 6 bzw. 8 für Download bzw. Upload (Man beginnt beim Zählen jeweils mit 0). Ansonsten muss man nur noch in Zeile 23 das „Ping“ durch „Retrieving“ ersetzen.
rule "Speedtest" when //Time cron "0 0 5,13 * * ?" or Time cron "0 0 * * * ?" or Item SpeedtestRerun received command ON then logInfo("Speedtest", "--> speedtest executed...") SpeedtestRunning.postUpdate("Messung läuft...") // update timestamp for last execution SpeedtestResultDate.postUpdate(new DateTimeType()) // execute the script, you may have to change the path depending on your system var String speedtestCliOutput = executeCommandLine("/usr/local/bin/speedtest.py --server 4997", 120*1000) //Inexio //var String speedtestCliOutput = executeCommandLine("/usr/local/bin/speedtest.py --server 1746", 120*1000) //Vodafone // for debugging: //var String speedtestCliOutput = "Ping: 43.32 ms\nDownload: 21.64 Mbit/s\nUpload: 4.27 Mbit/s" //logInfo("Speedtest", "--> speedtest output:\n" + speedtestCliOutput + "\n\n") SpeedtestRunning.postUpdate("Datenauswertung...") // starts off with a fairly simple error check, should be enough to catch all problems I can think of if (speedtestCliOutput.startsWith("Retrieving") && speedtestCliOutput.endsWith("Mbit/s")) { var String[] results = speedtestCliOutput.split("\\r?\\n") var float ping = new java.lang.Float(results.get(4).split(" ").get(6)) //Inexio // var float ping = new java.lang.Float(results.get(4).split(" ").get(7)) //Vodafone var float down = new java.lang.Float(results.get(6).split(" ").get(1)) var float up = new java.lang.Float(results.get(8).split(" ").get(1)) SpeedtestResultPing.postUpdate(ping) SpeedtestResultDown.postUpdate(down) SpeedtestResultUp.postUpdate(up) SpeedtestSummary.postUpdate(String::format("ᐁ%.1f ᐃ%.1fMbit/s | %.0f ms", down, up, ping)) SpeedtestRunning.postUpdate("-") logInfo("Speedtest", "--> speedtest finished.") } else { SpeedtestResultPing.postUpdate(0) SpeedtestResultDown.postUpdate(0) SpeedtestResultUp.postUpdate(0) SpeedtestSummary.postUpdate("(unbekannt)") SpeedtestRunning.postUpdate("Fehler bei der Ausführung") logError("Speedtest", "--> speedtest failed. Output:\n" + speedtestCliOutput + "\n\n") } SpeedtestRerun.postUpdate(OFF) end