. Oktober 2020 – Smarthome

bookmark_borderSpeedtest mit OpenHAB – neu

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:

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