NEWS
Speedtest-Skript von kreyenborg.koeln für Kabel-Gigabit
-
Hallo,
was mache ich falsch? In der Console funktioniert der Speedtest ohne Probleme. Das js Skript gibt mir Fehler aus. Ich nutze Docker von Bauanet. Mich wundert der Post von manuxi wo er beschreibt, dass buanet mit sudo nicht funktioniert. Bei mir ist es ja anscheinend mit sudo installiert.
(Das Skript ist unbearbeitet)
script.js.common.Speedtest:182:18:
// 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)), hole_datum() ]; return array_werte; }
-
@mephisto090 Dazu kann ich leider nichts sagen - ich habe kein Docker im Einsatz.
Ich denke, du musst via:
type -p speedtest
Schauen, wie der Pfad lautet. Diesen dann im Skript anpassen.
-
Das passt
-
@mephisto090 Und, wenn du das komplette Kommando via SSH eingibst, was passiert?
-
das hier
-
@mephisto090 Dann teste mal statt -f json --json
Musst dann ggf. das Kommando anpassen.
-
@skb laut ssh geht das irgendwie auch nicht
-
@mephisto090 Und nur mit --json ?
-
@skb scheint zu funktionieren. Habe es jetzt mal im script so angepasst.
-
-
@mephisto090 Konsolentexte nicht als Bild sondern kopieren und in Codetags hier einsetzen
-
@mephisto090 Dann wird es laufen
-
root@iobroker:/opt/iobroker# /usr/bin/speedtest --json
{ "bytes_received": 111995656, "bytes_sent": 43466752, "client": { "country": "DE", "ip": "???????", "isp": "Vodafone Germany DSL", "ispdlavg": "0", "isprating": "3.7", "ispulavg": "0", "lat": "11.111", "loggedin": "0", "lon": "22.222", "rating": "0" }, "download": 89252315.3942659, "ping": 26.842, "server": { "cc": "DE", "country": "Germany", "d": 5.1528760454098, "host": "speedeu.akesacloud.co.za:8080", "id": "60714", "lat": "52.5167", "latency": 26.842, "lon": "13.3833", "name": "Berlin", "sponsor": "Akesa IT - Europe", "url": "http://speedeu.akesacloud.co.za:8080/speedtest/upload.php" }, "share": null, "timestamp": "2023-10-20T14:47:20.708905Z", "upload": 34704998.6338473 }
root@iobroker:/opt/iobroker# /usr/bin/speedtest -h usage: speedtest [-h] [--no-download] [--no-upload] [--single] [--bytes] [--share] [--simple] [--csv] [--csv-delimiter CSV_DELIMITER] [--csv-header] [--json] [--list] [--server SERVER] [--exclude EXCLUDE] [--mini MINI] [--source SOURCE] [--timeout TIMEOUT] [--secure] [--no-pre-allocate] [--version] Command line interface for testing internet bandwidth using speedtest.net. -------------------------------------------------------------------------- https://github.com/sivel/speedtest-cli options: -h, --help show this help message and exit --no-download Do not perform download test --no-upload Do not perform upload test --single Only use a single connection instead of multiple. This simulates a typical file transfer. --bytes Display values in bytes instead of bits. Does not affect the image generated by --share, nor output from --json or --csv --share Generate and provide a URL to the speedtest.net share results image, not displayed with --csv --simple Suppress verbose output, only show basic information --csv Suppress verbose output, only show basic information in CSV format. Speeds listed in bit/s and not affected by --bytes --csv-delimiter CSV_DELIMITER Single character delimiter to use in CSV output. Default "," --csv-header Print CSV headers --json Suppress verbose output, only show basic information in JSON format. Speeds listed in bit/s and not affected by --bytes --list Display a list of speedtest.net servers sorted by distance --server SERVER Specify a server ID to test against. Can be supplied multiple times --exclude EXCLUDE Exclude a server from selection. Can be supplied multiple times --mini MINI URL of the Speedtest Mini server --source SOURCE Source IP address to bind to --timeout TIMEOUT HTTP timeout in seconds. Default 10 --secure Use HTTPS instead of HTTP when communicating with speedtest.net operated servers --no-pre-allocate Do not pre allocate upload data. Pre allocation is enabled by default to improve upload performance. To support systems with insufficient memory, use this option to avoid a MemoryError --version Show the version number and exit
--version: Python 3.11.2 (main, Mar 13 2023, 12:18:29) [GCC 12.2.0]
-
@skb leider nicht
16:49:14.239 info javascript.0 (951689) Start javascript script.js.common.Speedtest 16:49:14.243 info javascript.0 (951689) script.js.common.Speedtest: Speedtest: Erster Start des Skriptes! Datenpunkte werden erstellt! 16:49:14.244 info javascript.0 (951689) script.js.common.Speedtest: Speedtest: Datenpunkte erstellt! Erster Speedtest wird in 30 Sekunden ausgeführt! 16:49:14.246 info javascript.0 (951689) script.js.common.Speedtest: registered 1 subscription, 1 schedule, 0 messages, 0 logs and 0 file subscriptions 16:49:44.245 info javascript.0 (951689) script.js.common.Speedtest: Speedtest mit Server 37316 gestartet! Der Test dauert zwischen 10 - 20 Sekunden! 16:49:44.457 error javascript.0 (951689) script.js.common.Speedtest: SyntaxError: Unexpected end of JSON input 16:49:44.459 error javascript.0 (951689) at generiere_array (script.js.common.Speedtest:182:18) 16:49:44.459 error javascript.0 (951689) at script.js.common.Speedtest:231:28 16:49:44.570 error host.iobroker Caught by controller[0]: at generiere_array (script.js.common.Speedtest:205:18) 16:49:44.570 error host.iobroker Caught by controller[0]: at script.js.common.Speedtest:254:28
-
@skb habe jetzt auch mal das -s durch --server ersetzt
17:01:04.619 info javascript.0 (954175) Stop script script.js.common.Speedtest 17:01:06.582 info javascript.0 (954175) Start javascript script.js.common.Speedtest 17:01:06.595 info javascript.0 (954175) script.js.common.Speedtest: Speedtest: Erster Start des Skriptes! Datenpunkte werden erstellt! 17:01:06.597 info javascript.0 (954175) script.js.common.Speedtest: Speedtest: Datenpunkte erstellt! Erster Speedtest wird in 30 Sekunden ausgeführt! 17:01:06.611 info javascript.0 (954175) script.js.common.Speedtest: registered 1 subscription, 1 schedule, 0 messages, 0 logs and 0 file subscriptions 17:01:36.598 info javascript.0 (954175) script.js.common.Speedtest: Speedtest mit Server 37316 gestartet! Der Test dauert zwischen 10 - 20 Sekunden! 17:01:36.935 error javascript.0 (954175) script.js.common.Speedtest: Speedtest konnte nicht ausgeführt werden! Error: Command failed: /usr/bin/speedtest --json --server 37316 Cannot retrieve speedtest configuration ERROR: HTTP Error 403: Forbidden
Jetzt kommt diese Meldung
Edit: Habe jetzt den Server mit der ID rausgenommen und er führt auch den Speedtest aus. Leider passen wohl die Vars nicht mehr.
17:07:56.335 error javascript.0 (954175) script.js.common.Speedtest: TypeError: Cannot read properties of undefined (reading 'externalIp')
-
@mephisto090 sagte in Speedtest-Skript von kreyenborg.koeln für Kabel-Gigabit:
root@iobroker
da brauchen wir nicht weitermachen
Leg Dir einen User mit Sudorechten an.
-
@djmarc75 das ist docker in diesem container läuft nur ein service und das ist iobroker. ich glaube da ist das egal außerdem ist der nach außen hin nicht offen.
-
@mephisto090 sagte in Speedtest-Skript von kreyenborg.koeln für Kabel-Gigabit:
außerdem ist der nach außen hin nicht offen.
Das ist ja kein Grund. Angriffe können ja auch von innen heraus erfolgen. Durch heruntergeladenen Code. Und dieser Code läuft mit den Rechten des users. Bei root halt ganz schlecht.
Aber bei Docker soll es ja auch irgendwelchen Gründen, die mir bis heute noch niemand plausibel darlegen konnte, angeblich nicht möglich sein eine ordentliche Rechteverwaltung zu haben. -
@mephisto090 Die Variablen passen noch. Ich habe gerade die aktuelle Version des Speedtest (Speedtest by Ookla 1.2.0.84) installiert.
Hier werden wie erwartet alle Daten gefüllt. -
@skb So habe mein Fehler gefunden. Irgendwie war das falsche speedtest-cli installiert. Es funktioniert jetzt und habe mal etwas das Skript angepasst. (Gerne kannst du es auf deiner Seite aktualisieren) Ich habe ein Trigger DP als Button hinzugefügt und das Skript den Button auswerten lassen. Des Weiteren ist Max. und Min. Ping dazugekommen sowie Paket Lost für Down- und Upload. Ich habe das Skript noch mit einer der letzten Statusmeldung ergänzt.
/* * @copyright 2020 Stephan Kreyenborg <stephan@kreyenborg.koeln> * * @author 2020 Stephan Kreyenborg <stephan@kreyenborg.koeln> * * Dieses Skript dient zur freien Verwendung in ioBroker zur Überprüfung Deiner Internetgeschwindkeit mit Hilfe von Speedtest. * 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.3 * Erstell-Datum: 29. November 2021 * */ // Datenpunkte neu erstellen var ueberschreiben = false; // Hauptdatenpunkt unterhalb javascript var datenpunkt = "Speedtest."; // Favorisierter Server // Liste: https://www.speedtest.net/speedtest-servers.php var fav_server = 0; // Speedtest Objekte var objekt = ["JSON_Output", "Ergebnisse.PaketLost_Download", "Ergebnisse.PaketLost_Upload", "Ergebnisse.Ping", "Ergebnisse.Ping_Min", "Ergebnisse.Ping_Max", "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", "Test.Daten.Letzter_Speedtest", "Trigger", "Status" ]; // Beschreibung der Objekte var beschreibung = ["JSON Ausgabe der Konsole", "Paketverlust in %", "Paketverlust in %", "Ping in ms", "Min. Ping in ms", "Max. 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", "Letzter Speedtest", "Startet den Speedtest", "Status vom letzten Speedtest" ]; // Einheiten der Objekte var einheiten = ["", "%", "%", "ms", "ms", "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", "number", "number", "number", "number", "string", "string", "string", "string", "number", "string", "string", "string", "string", "string", "number", "number", "number", "number", "number", "number", "string", "boolean", "string" ]; // Rollen der Objekte var rolle = ["json", "value", "value", "value", "value", "value", "value", "value", "value", "value", "value", "value", "value", "text", "text", "text", "text", "value", "text", "text", "text", "text", "text", "value", "value", "value", "value", "value", "value", "text", "button", "text" ]; // Schreibe Werte des JSON String in ein Array function generiere_array(json_array) { var j = JSON.parse(json_array); var array_werte = [json_array, parseFloat((j.download.elapsed * 100 / j.download.bytes).toFixed(2)), parseFloat((j.upload.elapsed * 100 / j.upload.bytes).toFixed(2)), j.ping.latency, j.ping.low, j.ping.high, 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)), hole_datum(), false, "Speedtest wird durchgeführt" ]; return array_werte; } function speedtest() { // temporäre Variable für das Array var tmp_json; // Kommando für den Speedtest setStatus("Speedtest wird durchgeführt"); var kommando = "/usr/bin/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'); setState(datenpunkt + "Status", "Fehler", true); setStatus("Speedtest fehlerhaft"); return; } else { tmp_json = generiere_array(stdout); aktualisiere_datenpunkt(tmp_json); setStatus("Speedtest erfolgreich durchgeführt"); log('Speedtest durchgeführt. Ergebnisse: Download: ' + tmp_json[7] + ' MBits/s | Upload: ' + tmp_json[8] + ' MBits/s | Ping: ' + tmp_json[3] + 'ms'); } }); } function setStatus(text) { setState(datenpunkt + "Status", text, true); } 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] }); setStatus("Datenpunkte erfolgreich erstellt"); } // Alle Datenpunkte erstellt. Führe ersten Speedtest aus! log('Speedtest: Datenpunkte erstellt! Erster Speedtest wird in 30 Sekunden ausgeführt!'); setTimeout(speedtest, 30000); } // Datum function hole_datum() { let datum = new Date(); let tag = '0' + datum.getDate(); let monat = '0' + (datum.getMonth() + 1); let jahr = datum.getFullYear(); let stunde = '0' + datum.getHours(); let minute = '0' + datum.getMinutes(); let sekunde = '0' + datum.getSeconds(); return tag.substr(-2) + '.' + monat.substr(-2) + '.' + jahr + ' ' + stunde.substr(-2) + ':' + minute.substr(-2) + ':' + sekunde.substr(-2); } 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 60 Minuten einen Speedtest ausführen schedule('0,30 * * * *', speedtest); // Script ausführen wenn Datenpunkt "Speedtest-Trigger" = true on({ id: "javascript.0.Speedtest.Trigger", change: "any" }, function (obj) { if (obj.state.val===true) { speedtest (); } });