Speedtest für ioBroker

Dieser Artikel wurde zuletzt am 31.03.2021 um 13:48 Uhr aktualisiert

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

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

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

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 = "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);

11 Gedanken zu „Speedtest für ioBroker

  1. NullFear

    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

    Antworten
  2. Nullfear

    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

    Antworten
    1. Stephan Beitragsautor

      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

      Antworten
          1. NullFear

            Speedtest auf dem Pi funktioniert, habe den ioBroker allerdings in einem Container am laufen, konnte es daran liegen?

  3. frank

    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.

    Antworten
    1. Stephan Beitragsautor

      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

      Antworten

Schreibe einen Kommentar

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