Suche Programm/Script zum ausführen von Speedtest in zeitlichen Intervallen?

failXontour

Lieutenant
Registriert
Mai 2018
Beiträge
645
Hallo miteinander,

ist bestimmt schon gefragt worden. Rolle das ganze trotzdem nochmal auf da ich auf die schnelle im Thread keine Antwort finden konnte. Suche ein automatisches Programm/Script, zum Ausführen von Speedtest bei mir Privat. Leider haben offizielle Programme wie Breitbandmessung, Speedtest.net nicht automatische Optionen zum Testen.

Jetzt suche ich ein Script/Programm was den Task abnehmen sollte? Hat da jemand was im Peto. Möchte halt in zeitlichen Intervallen morgens, mittags, abends, nachts testen, um entsprechend hier einen besseren Überblick darüber zu gewinnen, wann regelmäßige Downtimes in der Leitung sind.

Sonntag ist bei mir zum Beispiel, so ein Ausnahmetag in unserer Wohnung mit schlechtem Internet.

Mit freundlichen Grüßen
Klosteinmann
 
Kenne das nur vom pi per cronjob
 
Unter Windows (nicht getestet, ich würde das eher gegen meinen eigenen Webspace/FTP-Server testen):
https://www.speedtest.net/de/apps/cli
Und das dann "irgendwie" (wird wohl in der Doku stehen) mittels Windows Aufgabenplanung (task scheduler) automatisieren.

Vom Router aus wäre das natürlich besser, damit Du nur die Internetgeschwindigkeit und nicht auch Dein eigenes Lan misst. Dass man sowas nicht per WLan/DLan miss, ist wohl selbstverständlich.
 
Unter windows? :s
Mit linux gäbe es da einige lösungen, aber windows wäre mir nix fix fertiges bekannt
 
Hab was auf meinem raspberry pi liegen, derzeit nicht aktiv, funktioniert aber - python script.

Bedarf / Interesse? Für Windows habe ich nichts anzubieten.

Nutzt "speedtest-cli" ( https://www.speedtest.net/de/apps/cli ) und wird per script ausgeführt ( nix dolles, aber python ist nicht meine "native" language :D )

(( // edit : ok sehe gerade, das cli programm gibt es dort auch für windows, müsste man sich ggf. selbst ein script basteln oder schauen, ob u.g. code auch unter windows / powershell läuft )

Python:
import os
import re
import subprocess
import time

response = subprocess.Popen('/usr/local/bin/speedtest-cli --simple', shell=True, stdout=subprocess.PIPE).stdout.read().decode('utf-8')

ping = re.findall('Ping:\s(.*?)\s', response, re.MULTILINE)
download = re.findall('Download:\s(.*?)\s', response, re.MULTILINE)
upload = re.findall('Upload:\s(.*?)\s', response, re.MULTILINE)

ping = ping[0].replace(',', '.')
download = download[0].replace(',', '.')
upload = upload[0].replace(',', '.')

try:
    f = open('~/speedtest/results/speedtest.csv', 'a+')
    if os.stat('~/speedtest/results/speedtest.csv').st_size == 0:
            f.write('Date,Time,Ping (ms),Download (Mbit/s),Upload (Mbit/s)\r\n')
except:
    pass

f.write('{},{},{},{},{}\r\n'.format(time.strftime('%m/%d/%y'), time.strftime('%H:%M'), ping, download, upload))

Im Logfile steht dann sowas pro Messung:

11/05/20,07:32,33.553,94.25,36.46

... kann man wenn man auf Excel-Pron steht dann auch noch dort importieren, da csv
 
Zuletzt bearbeitet:
Ok, hab ich mir gedacht. Kenne mich an dieser Stelle nicht damit genauer aus, da ich nur unter OSX und Linux unterwegs bin, was Entwicklung angeht, aber was ich von nem Kollegen mitbekommen habe, der sich zum Entwickeln ( abseits .net ) Windows antut ... ja, ich habe es vermutet :D
 
Kenny [CH] schrieb:
So einfach und mit wenigens lines nicht
Warum sollte es nicht?
Python läuft auch auf Windows und die CLI gibts auch für Windows.

Notfalls kann man in Windows auch jeden Linux-Terminal Befehl mit wsl befehl ausführen

Die Pfade muss man halt anpassen...
 
KitKat::new() schrieb:
Warum sollte es nicht?
Python läuft auch auf Windows und die CLI gibts auch für Windows.

Notfalls kann man in Windows auch jeden Linux-Terminal Befehl mit wsl befehl ausführen

Die Pfade muss man halt anpassen...
Stimmt python läuft auch auf windows. Würde aber dennoch nicht heissen, dass das script so und ohne viel anpassungen verwendet werden kann. Scripte aber under windows zu wenig - daher nicht alöes bekannt - weiss aber das es für vieledinge kein wirkline ersatz unter windows gibt aka grep oder awk etc ;) - nicht das es nicht geht aber denke selbst dann wäre der windows code evtl länger als unter linux ;)
Wenn du aber mit Wsl beginst na dann sind wir bei linux - da wäre eher die frage ob der wsl layer via task scheduler oder crontab "korrekt" gesteuert werden kan. Auch ohne das die console offen ist.
 
Kenny [CH] schrieb:
da wäre eher die frage ob der wsl layer via task scheduler oder crontab "korrekt" gesteuert werden kan. Auch ohne das die console offen ist.
wsl.exe ist eine normale ausführbare Datei 😉

Beispiel (vor Dollarzeichen muss man escapen):
PowerShell:
wsl bash -c @"
>> ls
>> ifconfig eth0 | grep 'inet ' | awk '{ print \`$2 }'
>> "@
log.csv speedtest.exe speedtest.md speedtest.ps1
192.168.xx.xx

Davon ab, gibts mit Powershell einfacheres:
PowerShell:
.\speedtest.exe -f json -p no --server-id=5662 | ConvertFrom-Json
PowerShell:
type       : result
timestamp  : 06/08/2021 18:07:45
ping       : @{jitter=0,109; latency=21,882}
download   : @{bandwidth=12083872; bytes=109548048; elapsed=9209}
upload     : @{bandwidth=5408258; bytes=32894619; elapsed=6101}
packetLoss : 0
isp        : zensiert
interface  : @{internalIp=zensiert; name=; macAddr=zensiert; isVpn=False; externalIp=zensiert}
server     : @{id=zensiert; name=KufNet; location=Kufstein; country=Austria; host=speedtest.kufnet.at; port=8080; ip=zensiert}
result     : @{id=zensiert; url=zensiert}

Ausformuliert als script:
PowerShell:
# speedtest.ps1
# Configuration
$oaclaExecutable = '.\speedtest.exe'
$serverId = 5662
$logFile = 'log.csv'

$testResult = & $oaclaExecutable -f json -p no --server-id=$serverId | ConvertFrom-Json
$download = $testResult.download.bandwidth
$upload = $testResult.upload.bandwidth
$ping = $testResult.ping.latency
if (!(Test-Path $logFile)){
    Add-Content -Path $logFile -Value 'Timestamp,Download,Upload,Ping'
}
Add-Content -Path $logFile -Value "$(Get-Date),$($download),$($upload),$($ping)"

Legt eine csv-Datei an, die in etwa so gefüllt wird:
Code:
Timestamp,Download,Upload,Ping
08/06/2021 20:36:33,12087205,5403928,21.532
08/06/2021 20:37:00,12036349,5405335,21.638
08/06/2021 20:37:16,12112278,5399780,21.754
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: failXontour
Ich frage mal ganz blöd nach, kriege es bei mir momentan nicht zum Laufen. Also für einen DAU. Habe Speedtest als 64-bit Anwendung installiert, auch über den MS-Store.

Er gibt bei mir die log.csv aus ohne Daten. Scheinbar da er nicht den Pfad .\speedtest.exe findet, was genau muss ich hier noch machen?

  • Windows Subsystem für Linux einschalten in Windows Funktionen und PC neustarten ✓
  • @KitKat::new() Powershell Script als ps1 Datei abspeichern und per Rechtklick Powershell ausführen, anwählen ✓
  • ???
  • Das ganze im Aufgabenplanung/Task Scheduler in Windows entsprechend Zeitlich definieren. ✓
Hier einmal meine geplante Aufgabe für den Tag mit jeweiligem Speedtest alle 6 Stunden. Kann die Datei nicht hochladen, doch den Code kann man sich einfach abspeichern als .xml Datei falls man es so verwenden möchte/kann natürlich auf die Pfade achten.
XML:
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2021-08-07T01:58:42.6973504</Date>
    <Author>PC-FELIX\Klosteinmann</Author>
    <Description>Automatische Speedtest in zeitlichen Abständen</Description>
    <URI>\Speedtest</URI>
  </RegistrationInfo>
  <Triggers>
    <CalendarTrigger>
      <StartBoundary>2021-08-07T06:00:00</StartBoundary>
      <Enabled>true</Enabled>
      <ScheduleByDay>
        <DaysInterval>1</DaysInterval>
      </ScheduleByDay>
    </CalendarTrigger>
    <CalendarTrigger>
      <StartBoundary>2021-08-07T12:00:00</StartBoundary>
      <Enabled>true</Enabled>
      <ScheduleByDay>
        <DaysInterval>1</DaysInterval>
      </ScheduleByDay>
    </CalendarTrigger>
    <CalendarTrigger>
      <StartBoundary>2021-08-07T18:00:00</StartBoundary>
      <Enabled>true</Enabled>
      <ScheduleByDay>
        <DaysInterval>1</DaysInterval>
      </ScheduleByDay>
    </CalendarTrigger>
    <CalendarTrigger>
      <StartBoundary>2021-08-07T00:00:00</StartBoundary>
      <Enabled>true</Enabled>
      <ScheduleByDay>
        <DaysInterval>1</DaysInterval>
      </ScheduleByDay>
    </CalendarTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>S-1-5-21-3614514313-2022557513-2540892273-1001</UserId>
      <LogonType>InteractiveToken</LogonType>
      <RunLevel>LeastPrivilege</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>C:\Users\Klosteinmann\Desktop\Script.ps1</Command>
    </Exec>
  </Actions>
</Task>

  • Profit in CSV-Log? ✓
Wurde vorher Speedtest als Systemvariable hinterlegt, oder wie genau funktioniert das? Selbst mit hinterlegten Path findet, Windows scheinbar nicht das Programm. % Brainlag... %
 
Zuletzt bearbeitet:
Klosteinmann schrieb:
Windows Subsystem für Linux einschalten in Windows Funktionen und PC neustarten ✓
Wird für mein Script gar nicht benötigt, war nur ne Idee für den Notfall 🙃
Klosteinmann schrieb:
Wurde vorher Speedtest als Systemvariable hinterlegt, oder wie genau funktioniert das?
Die Idee war einfach den Pfad anzugeben (entweder absolut oder relativ zum Scriptpfad). Systemvariable und im Script dann nur den Namen hätte auch funktioniert.

Klosteinmann schrieb:
Die gewünschte Server-ID auswählen oder aus Zeile 7 die Option mit der Server-ID entfernen (dann wird automatisch ein Server ausgewählt)
 
KitKat::new() schrieb:
In welche Einheit? Direkt im script?
In der CSV steht folgende Werte bei einer 500 Mbit Leitung. Hatte
Timestamp​
Download​
Upload​
Ping​
08/07/2021 20:10:44​
69409911​
3454320​
44183​

Neuer Wert bei LWLcom Bremen
08/07/2021 20:27:52​
68894928​
3444727​
27625​

Wobei der Wert könnte hinkommen, da die Server ID auf einen Server in Kufstein* verweist facepalm. Ich probiere das nochmal mit 5733.
 
Zuletzt bearbeitet:
Klosteinmann schrieb:
da die Server ID auf einen Server in Kufstein* verweist facepalm. Ich probiere das nochmal mit 5733.
wie gesagt, kannst auch den Parameter rauslöschen, indem du in Zeile 7 no --server-id=$serverId entfernst, dann wird von Ookla automatisch ein Server ausgewählt.

Und der Wert passt doch:
69409911 Byte/s = 555,279288 Mbit/s

EDIT: Ah ok, der Ping sieht miserabel aus. Kann es sein, dass du einen Punkt oder Komma vergessen hast?
 
Ja momentan passt er. Kann ich mir den nicht per CLI, direkt den Wert in Mbp/s ausgeben lassen? Das sollte doch möglich sein. Vielleicht kannst du mir ja einen kleinen Exkurs im Programmieren geben, wo genau finde ich die Variablen, auf die man zurückgreifen kann?

EDIT: Hab extra jetzt nochmal das Script von oben kopiert und die Server ID als einziges Angepasst. Jetzt sind die Pingwerte auch besser also das neuste ist hat auch entsprechend einen annehmbaren Ping.

08/07/2021 20:48:23​
69276862​
3468802​
29.315000000000001​
 
Zuletzt bearbeitet:
Zurück
Oben