Für ioBroker gibt es aktuell 2 Speedtest Adapter, die bei vielen funktionieren – jedoch bei vielen eben auch nicht. Das ist besonders der Fall, wenn man einen Vodafone Cable Max 1000 (ehemals Unitymedia) Tarif hat. Ich habe noch nicht herausgefunden, wieso diese Speedtests nicht richtig laufen – jedoch habe ich mir selbst Abhilfe geschaffen, um hier auch selbst vernünftige Werte zu erhalten.

Vorbereitung

Damit der Speedtest richtig funktioniert, muss das Paket von Ookla (Speedtest.net) installiert werden. Dazu loggen wir uns auf dem Pi ein und führen folgende Befehle aus. Solltest Du bereits einen Speedtest installiert haben, der bspw. mit “speedtest-cli” aufgerufen wird, so ist dieser vorher zu entfernen.

Speedtest-CLI entfernen:

sudo apt-get remove speedtest-cli

Ookla Speedtest installieren

cd /etc/
mkdir speedtest
cd /etc/speedtest
wget https://install.speedtest.net/app/cli/ookla-speedtest-1.0.0-arm-linux.tgz
(Diese Version ggf. an Dein System anpassen -> https://www.speedtest.net/de/apps/cli)
sudo tar -xvzf ookla-speedtest-1.0.0-arm-linux.tgz
rm ookla-speedtest-1.0.0-arm-linux.tgz

Datenpunkte

Das Skript füllt die eigenen Datenpunkte mit allen verfügbaren Rückgabewerten, die dieser Test zur Verfügung stellt. Des Weiteren sind die Datenpunkte strukturiert aufgebaut. Das heißt, der Datenpunkt Ergebnisse enthält alle Daten eines Test, wohingegen der Datenpunkt Test (mit Unterpunkten: Server und Daten) Informationen zu dem eigentlichen Test enthält. Auch gibt es einen Datenpunkt Server, welcher die Informationen zur Gegenstelle vorhält.

DatenpunktBeschreibung
JSON_OutputAusgabe der Konsole
PingPing in ms
JitterJitter in ms
Download_MBitDownload Geschwindigkeit in MBit/s
Upload_MBitUpload Geschwindigkeit in MBit/s
Download_MBDownload Geschwindigkeit in MB/s
Upload_MBUpload Geschwindigkeit in MB/s
OriginalDownloadDownload Geschwindigkeit in Byte/s
OriginalUploadUpload Geschwindigkeit in Byte/s
ISPInternet Service Provider
IPexterne IP
URLAdresse der Ergebnisse
IDID der Ergebnisse
ServerIDID des getesteten Servers
ServerIPIP des getesteten Servers
NameAnbieter des getesteten Servers
StadtStadt des getesteten Servers
LandLand des getesteten Servers
AdresseURL des getesteten Servers
DownloadDownload Daten in MB
UploadUpload Daten in MB
OriginalDownloadDownload Daten in Byte
OriginalUploadUpload Daten in Byte
DauerDownloadDauer des Download Test in Sekunden
DauerUploadDauer des Upload Test in Sekunden
Verfügbare Datenpunkte des Skripts

Skript

Nun erstellen wir in ioBroker ein neues Skript im common Bereich. Es bekommt den Namen “Speedtest”.

Der Aufruf erfolgt alle 30 Minuten und kann in der letzten Zeile angepasst werden. Auch lässt sich zur besseren Diagnose der eigenen Leitung ein fester Server in Zeile 32 eintragen. Eine Liste mit Servern in Deiner Umgebung gibt es hier:
https://www.speedtest.net/speedtest-servers.php

Hier schaust du am Ende nach der ID. Diese ID kommt dann in Zeile 32.

ID des Servers herausfinden
ID des Servers herausfinden

Soll das Skript immer den besten Server nehmen und automatisch entscheiden, so lasse diesen bei 0.

/*
 * @copyright 2020 Stephan Kreyenborg <stephan@kreyenborg.koeln>
 *
 * @author 2020 Stephan Kreyenborg <stephan@kreyenborg.koeln>
 *
 * Dieses Skript dient zur freien Verwendung in ioBroker zur Verbrauchserfassung der Shelly Geräte.
 * Jegliche Verantwortung liegt beim Benutzer. Das Skript wurde unter Berücksichtigung der bestmöglichen Nutzung
 * und Performance entwickelt.
 * Der Entwickler versichert, das keine böswilligen Systemeingriffe im originalen Skript vorhanden sind.
 *
 * Sollte das Skript wider Erwarten nicht korrekt funktionieren, so hast Du jederzeit die Möglichkeit, Dich auf
 * https://www.kreyenborg.koeln
 * für Unterstützung zu melden. Jedes Skript besitzt seine eigene Kommentarseite, auf der,
 * nach zeitlicher Möglichkeit des Autors, Hilfe angeboten wird. Ein Anrecht hierauf besteht nicht!
 * 
 * Ansprüche gegenüber Dritten bestehen nicht. 
 * 
 * Skript Name:		Speedtest
 * Skript Version:	1.1
 * Erstell-Datum:	11. März 2021
 * 
 */

// Datenpunkte neu erstellen
var ueberschreiben = false;

// Hauptdatenpunkt unterhalb javascript
var datenpunkt = "Speedtest.";

// Favorisierter Server
// Liste: https://www.speedtest.net/speedtest-servers-static.php
var fav_server = 0;

// Speedtest Objekte
var objekt = ["JSON_Output",
    "Ergebnisse.Ping",
    "Ergebnisse.Jitter",
    "Ergebnisse.Download_MBit",
    "Ergebnisse.Upload_MBit",
    "Ergebnisse.Download_MB",
    "Ergebnisse.Upload_MB",
    "Ergebnisse.OriginalDownload",
    "Ergebnisse.OriginalUpload",
    "ISP",
    "IP",
    "Ergebnisse.URL",
    "Ergebnisse.ID",
    "Test.Server.ServerID",
    "Test.Server.ServerIP",
    "Test.Server.Name",
    "Test.Server.Stadt",
    "Test.Server.Land",
    "Test.Server.Adresse",
    "Test.Daten.Download",
    "Test.Daten.Upload",
    "Test.Daten.OriginalDownload",
    "Test.Daten.OriginalUpload",
    "Test.Daten.DauerDownload",
    "Test.Daten.DauerUpload"
];

// Beschreibung der Objekte
var beschreibung = ["JSON Ausgabe der Konsole",
    "Ping in ms",
    "Jitter in ms",
    "Download Geschwindigkeit in MBit/s",
    "Upload Geschwindigkeit in MBit/s",
    "Download Geschwindigkeit in MB/s",
    "Upload Geschwindigkeit in MB/s",
    "Download Geschwindigkeit in Byte/s",
    "Upload Geschwindigkeit in Byte/s",
    "Internet Service Provider",
    "externe IP",
    "Adresse der Ergebnisse",
    "ID der Ergebnisse",
    "ID des getesteten Servers",
    "IP des getesteten Servers",
    "Anbieter des getesteten Servers",
    "Stadt des getesteten Servers",
    "Land des getesteten Servers",
    "URL des getesteten Servers",
    "Download Daten in MB",
    "Upload Daten in MB",
    "Download Daten in Byte",
    "Upload Daten in Byte",
    "Dauer des Download Test",
    "Dauer des Upload Test"
];

// Einheiten der Objekte
var einheiten = ["",
    "ms",
    "ms",
    "MBit/s",
    "MBit/s",
    "MB/s",
    "MB/s",
    "Byte/s",
    "Byte/s",
    "",
    "",
    "",
    "",
    "",
    "",
    "",
    "",
    "",
    "",
    "MB",
    "MB",
    "Byte",
    "Byte",
    "s",
    "s"
];

// Typen der Objekte
var typen = ["string",
    "number",
    "number",
    "number",
    "number",
    "number",
    "number",
    "number",
    "number",
    "string",
    "string",
    "string",
    "string",
    "number",
    "string",
    "string",
    "string",
    "string",
    "string",
    "number",
    "number",
    "number",
    "number",
    "number",
    "number"
];

// Rollen der Objekte
var rolle = ["json",
    "value",
    "value",
    "value",
    "value",
    "value",
    "value",
    "value",
    "value",
    "text",
    "text",
    "text",
    "text",
    "value",
    "text",
    "text",
    "text",
    "text",
    "text",
    "value",
    "value",
    "value",
    "value",
    "value",
    "value"
];

// Schreibe Werte des JSON String in ein Array
function generiere_array(json_array) {
    var j = JSON.parse(json_array);
    var array_werte = [json_array,
        j.ping.latency,
        j.ping.jitter,
        parseFloat((j.download.bandwidth / 125000).toFixed(2)),
        parseFloat((j.upload.bandwidth / 125000).toFixed(2)),
        parseFloat((j.download.bandwidth / (1024 * 1024)).toFixed(2)),
        parseFloat((j.upload.bandwidth / (1024 * 1024)).toFixed(2)),
        j.download.bandwidth,
        j.upload.bandwidth,
        j.isp,
        j.interface.externalIp,
        j.result.url,
        j.result.id,
        j.server.id,
        j.server.ip,
        j.server.name,
        j.server.location,
        j.server.country,
        j.server.host,
        parseFloat((j.download.bytes / (1024 * 1024)).toFixed(2)),
        parseFloat((j.upload.bytes / (1024 * 1024)).toFixed(2)),
        j.download.bytes,
        j.upload.bytes,
        parseFloat((j.download.elapsed / 1000).toFixed(2)),
        parseFloat((j.upload.elapsed / 1000).toFixed(2)),
    ];
    return array_werte;
}

function speedtest() {
    // temporäre Variable für das Array
    var tmp_json;
    // Kommando für den Speedtest
    var kommando = "/etc/speedtest/speedtest -f json --accept-license --accept-gdpr";
    if (fav_server > 0) {
        kommando = kommando + " -s " + fav_server;
        log("Speedtest mit Server " + fav_server + " gestartet! Der Test dauert zwischen 10 - 20 Sekunden!");
    } else {
        log("Speedtest gestartet! Der Test dauert zwischen 10 - 20 Sekunden!");
    }
    exec(kommando,
        function (error, stdout) {
            if (error) {
                log('Speedtest konnte nicht ausgeführt werden! ' + error, 'error');
                return;
            } else {
                tmp_json = generiere_array(stdout);
                aktualisiere_datenpunkt(tmp_json);
                log('Speedtest durchgeführt. Ergebisse: Download: ' + tmp_json[5] + ' MB/s | Upload: ' + tmp_json[6] + ' MB/s | Ping: ' + tmp_json[1] + 'ms');
            }
        });
}

function aktualisiere_datenpunkt(werte) {
    for (let i = 0; i < objekt.length; i++) {
        setState(datenpunkt + objekt[i], werte[i], true);
    }
}

// Erstelle die benötigten Datenpunkte
function datenpunkte_erstellen() {
    for (var i = 0; i < objekt.length; i++) {
        createState(datenpunkt + objekt[i], "", ueberschreiben, {
            name: beschreibung[i],
            desc: beschreibung[i],
            type: typen[i],
            role: rolle[i],
            unit: einheiten[i]
        });
    }

    // Alle Datenpunkte erstellt. Führe ersten Speedtest aus!
    log('Speedtest: Datenpunkte erstellt! Erster Speedtest wird in 30 Sekunden ausgeführt!');
    setTimeout(speedtest, 30000);
}

function speedtest_erster_start() {
    log("Speedtest: Erster Start des Skriptes! Datenpunkte werden erstellt!");
    // Datenpunkte werden erstellt
    datenpunkte_erstellen();
}

// Erster Start und Initialisierung
speedtest_erster_start();

// Alle 30 Minuten einen Speedtest ausführen
schedule('*/30 * * * *', speedtest);

Kategorien:

23 Kommentare

  1. Hi

    habe deinen Skript gerade getestet. Leider erhalte ich immer einen Fehler im Log

    (10871) script.js.common.Speedtest2: Speedtest konnte nicht ausgeführt werden! Error: Command failed: speedtest -f json –accept-license –accept-gdpr /bin/sh: 1: speedtest: not found

  2. Hi,

    habe grade dein Skript getestet, leider bekomme ich eine Fehlermeldung.

    /bin/sh: 1: speedtest: not found

    script.js.common.Speedtest: Speedtest konnte nicht ausgeführt werden! Error: Command failed: speedtest -f json –accept-license –accept-gdpr

    Vielleicht kannst du mir ja dabei helfen

    Gruß Andy

    • Hallo Nullfear,
      die o.g. Schritte:
      sudo apt-get install gnupg1 apt-transport-https dirmngr
      export INSTALL_KEY=379CE192D401AB61
      sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys $INSTALL_KEY
      echo "deb https://ookla.bintray.com/debian generic main" | sudo tee /etc/apt/sources.list.d/speedtest.list
      sudo apt-get update
      sudo apt-get install speedtest

      hast Du aber ausgeführt?

      Gruß,
      Stephan

  3. Hallo Stephan,
    Danke fuer die tolle Skript-Idee. Sehr nuetzlich. Vielen Dank. Mir ist allerdings aufgefallen, dass bei mir die Ergebisse stark variieren zwischen “speedtest -s ” und dem von Dir verwendeten Kommando “speedtest -f json –accept-license –accept-gdpr -s . Beides aus iobroker heraus ausgefuerht. Hast Du dafuer eine Erklaerung? Vielen Dank.

    • Hi Frank,
      dies kommt wahrscheinlich dadurch, wenn du den “fav_server” nicht angegeben hast und das Skript einen zufälligen Server auswählt.
      Dadurch variieren die Messungen des Öfteren.

      Gruß,
      Stephan

  4. Hallo,

    Hallo

    das Script läuft soweit (DANKE!)

    javascript.0 2021-04-22 21:11:53.845 info (10107) script.js.common.Speedtest: Speedtest durchgeführt. Ergebisse: Download: 34.58 MB/s | Upload: 1.35 MB/s | Ping: 9.047ms
    javascript.0 2021-04-22 21:11:34.306 info (10107) script.js.common.Speedtest: Speedtest gestartet! Der Test dauert zwischen 10 – 20 Sekunden!

    aber es werden nur die zwei Datenpunkte (DL und Upload?gefüllt.

    Woran kann das liegen?

    Gruß Nico

    Ergebnisse#10
    delete
    Download_MB
    state
    Download Geschwindigkeit in MB/s
    state value 34.58 MB/s edit
    delete
    build
    Download_MBit
    state
    Download Geschwindigkeit in MBit/s
    state value edit
    delete
    build
    ID
    state
    ID der Ergebnisse
    state text edit
    delete
    build
    Jitter
    state
    Jitter in ms
    state value edit
    delete
    build
    OriginalDownload
    state
    Download Geschwindigkeit in Byte/s
    state value edit
    delete
    build
    OriginalUpload
    state
    Upload Geschwindigkeit in Byte/s
    state value edit
    delete
    build
    Ping
    state
    Ping in ms
    state value edit
    delete
    build
    URL
    state
    Adresse der Ergebnisse
    state text edit
    delete
    build
    Upload_MB
    state
    Upload Geschwindigkeit in MB/s
    state value 1.35 MB/s edit
    delete
    build
    Upload_MBit
    state
    Upload Geschwindigkeit in MBit/s
    state value edit
    delete
    build
    IP
    state
    externe IP
    state text edit
    delete
    build
    ISP
    state
    Internet Service Provider
    state text edit
    delete
    build
    JSON_Output
    state
    JSON Ausgabe der Konsole
    state json

    • Hallo Nico,
      der Datenbaum von iobroker wird im Browser manchmal nicht direkt aktualisiert.
      Bitte einmal oben links das Pfeil-Rad drücken oder in der Objekte Ansicht die Seite aktualisieren.
      Dann solltest Du Werte sehen können.
      Oder erscheinen Fehler im Log?

      Gruß,
      Stephan

  5. Hallo, würde das Script gerne nutzen, allerdings bekomme ich eine Fehlermeldung beim installieren der zuvor genannten Schritte. Exakt bei “Ookla Speedtest installieren Schritt 5”, hier ist der Fehler, dass das Paket Archiv den Zugriff verweigert.
    —-
    Fehl:4 https://ookla.bintray.com/debian generic InRelease
    403 Forbidden [IP: 34.216.248.36 443]
    N: Eine Aktualisierung von solch einem Depot kann nicht auf eine sichere Art durchgeführt werden, daher ist es standardmäßig deaktiviert.
    N: Weitere Details zur Erzeugung von Paketdepots sowie zu deren Benutzerkonfiguration finden Sie in der Handbuchseite apt-secure(8).
    —-
    Habe Rpi4 und Buster installiert. Leider reichen meine Kenntnisse nicht aus, um zu verstehen wie der Update möglich ist.
    Kann hier jemand helfen.
    Vielen Dank vorab
    Sebastian

    • Hallo Sebastian,
      tut mir Leid, das Du mit einem meiner Beiträge Probleme hast.
      Ich hatte gelesen, das Ookla (Speedtest) eine neue Version herausbringt und somit mein Skript vielleicht nicht mehr funktioniert – das scheint hier der Fall zu sein.
      Wenn Du mir 1-2 Tage Zeit gibst, würde ich dies korrigieren.

      Vielen Dank!

      Gruß,
      Stephan

  6. Hi!
    Die komischen Werte bei meinem Gigabit-Anschluss haben mich auch extrem genervt, daher vielen Dank für das skript, funktioniert wunderbar.

    Ich habe es allerdings etwas anders aufgesetzt/anpassen müssen.
    Ich ziehe das bin-file über apt rein, nicht händisch.

    Meine /etc/apt/sources.list.d/ookla_speedtest-cli.list sieht so aus:

    # this file was generated by packagecloud.io for
    # the repository at https://packagecloud.io/ookla/speedtest-cli

    deb https://packagecloud.io/ookla/speedtest-cli/debian/ bullseye main
    deb-src https://packagecloud.io/ookla/speedtest-cli/debian/ bullseye main

    Daher landet das Ganze dann in /usr/bin und muss im Skript noch angepasst werden.

    Viele Grüße aus Bayenthal!

    • Hallo Thomas,
      Danke für den Hinweis. Zum Zeitpunkt des Beitrags gab es den Speedtest leider noch nicht im offiziellen Repository.
      Daher ist der manuelle Weg noch beschrieben.

      Grüße,
      Stephan

  7. Was genau muss in Zeile 32 eingetragen werden, damit ein fester Server genommen wird bzw. wie muss die Zeile aussehen?
    Bei mir funktioniert es nicht.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.