Nach mehreren Versionen der Implementierung eines dauerhaften Speedtests bin ich im OpenHAB Forum wieder auf einen sehr guten Artikel gestoßen. Seit ich den Speedtest anhand dieses Artikels eingerichtet habe läuft nun alles super.
Man muss dazu nur ein paar Vorbereitungen treffen:
- Man muss das Exec Binding sowie die JASONPath Transformation installieren.
- Icons aus dem Beitrag in das eigene Icons Verzeichnis speichern wenn man diese wie ich nutzen möchte.
- Anschließend installiert man die offizielle Speedtest CLI Version wie auf der Website angegeben ist.
sudo apt-get install gnupg1 apt-transport-https dirmngr export INSTALL_KEY=379CE192D401AB61 # Ubuntu versions supported: xenial, bionic # Debian versions supported: jessie, stretch, buster export DEB_DISTRO=$(lsb_release -sc) sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys $INSTALL_KEY echo "deb https://ookla.bintray.com/debian ${DEB_DISTRO} main" | sudo tee /etc/apt/sources.list.d/speedtest.list sudo apt-get update # Other non-official binaries will conflict with Speedtest CLI # Example how to remove using apt-get # sudo apt-get remove speedtest-cli sudo apt-get install speedtest
Anschließend kann man sich mit
speedtest -L
eine Liste der Server anzeigen lassen die in der Nähe sind. Um sich einen festen Server auszusuchen. Diesen merken wir uns. Geht natürlich auch ohne aber ich mache es lieber so. Nun noch die Items anlegen. Die sehen bei mir so aus
String SpeedtestSummary "FRITZ!Box [%s]" <network> Number SpeedtestResultPing "Ping [%.3f ms]" <"speedtest_ping"> Number SpeedtestResultDown "Downlink [%.2f Mbit/s]" <"speedtest_download"> Number SpeedtestResultUp "Uplink [%.2f Mbit/s]" <"speedtest_upload"> String SpeedtestRunning "Speedtest running ... [%s]" <"speedtest_run"> String SpeedtestTestServer "Testserver [%s]" <"speedtest_summary"> Switch SpeedtestRerun "Start manuell" <"speedtest_reload"> DateTime SpeedtestResultDate "letzter Test [%1$td.%1$tm.%1$tY, %1$tR Uhr]" <"speedtest_date"> String SpeedtestResultError "Error Message [%s]" <"speedtest_error">
Danach kommt dann das anlegen der eigentlichen Regel, die bei mir so aussieht. In Zeile 12 „–accept-license –accept-gdpr“ muss man nicht unbedingt jedesmal mitgeben. Klappt bei mir aber Problemlos wenn ich das einfach dauerhaft mitgebe und dann kann ich es bei Updates etc auch nicht vergessen.
rule "Speedtest" when Time cron "0 0 * * * ?" or Item SpeedtestRerun changed from OFF to ON or Item SpeedtestRerun received command ON then SpeedtestRunning.postUpdate("Messung läuft...") system val speedtestExecute = "speedtest --accept-license --accept-gdpr -s 33264 -f json" //Hochschule Trier var speedtestCliOutput = executeCommandLine(speedtestExecute, 120*1000) 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("{\"type\":\"result\",") && speedtestCliOutput.endsWith("}}")) { var ping = Float::parseFloat(transform("JSONPATH", "$.ping.latency", speedtestCliOutput)) SpeedtestResultPing.postUpdate(ping) var float down = Float::parseFloat(transform("JSONPATH", "$.download.bandwidth", speedtestCliOutput)) down = (down / calc) SpeedtestResultDown.postUpdate(down) var float up = Float::parseFloat(transform("JSONPATH", "$.upload.bandwidth", speedtestCliOutput)) up = (up / calc) SpeedtestResultUp.postUpdate(up) var String server = transform("JSONPATH", "$.server.name", speedtestCliOutput) + ', ' + transform("JSONPATH", "$.server.location", speedtestCliOutput) SpeedtestTestServer.postUpdate(server) SpeedtestSummary.postUpdate(String::format("ᐁ%.1f ᐃ%.1f Mbit/s | %.0f ms", down, up, ping)) SpeedtestRunning.postUpdate("-") // update timestamp for last execution val String ResultDate = "" + new DateTimeType() SpeedtestResultDate.postUpdate(ResultDate) } else { SpeedtestResultPing.postUpdate(0) SpeedtestResultDown.postUpdate(0) SpeedtestResultUp.postUpdate(0) SpeedtestSummary.postUpdate("(unbekannt)") SpeedtestRunning.postUpdate("Fehler") logError(ruleId, "--> speedtest failed. Output:\n" + speedtestCliOutput + "\n\n") } SpeedtestRerun.postUpdate(OFF) end