BroSpeedTester/speedtester.py

104 lines
2.9 KiB
Python

from configuration import read_config
# region Logger
import logging
from debug import setup_logging
log = logger = logging.getLogger("default")
setup_logging()
# endregion
from dbo import Entry
def gather_data():
log.debug("Gathering data...")
downloads = []
uploads = []
dates = []
for entry in Entry.select():
downloads.append(entry.download)
uploads.append(entry.upload)
dates.append(entry.date_created)
return dates, downloads, uploads
def generate_plot_image(dates, downloads, uploads):
log.debug("Genering image output...")
import matplotlib
import matplotlib.pyplot as plt
dates = matplotlib.dates.date2num(dates)
plt.plot_date(dates, downloads, fmt="b-")
plt.ylabel('Download Speed Mbps')
plt.savefig(read_config()['output_image_path'])
def generate_txt_output(dates, downloads, uploads):
log.debug("Genering txt output...")
txt = "Date: Down; Up;\n"
for i, date in enumerate(dates):
download = downloads[i]
upload = uploads[i]
txt += f"{date}: {download} Mbps; {upload} Mbps\n"
with open(read_config()['output_txt_path'], "w+") as f:
f.write(txt)
if __name__ == "__main__":
'''
This script will run a few speed tests, calculate average upload and download speeds and record them into database.
Once finished it will also generate an image with graph plotted.
'''
from random import uniform
try:
import speedtest
servers = []
threads = None
for i in range (0, 3):
try:
log.debug("Initializing speedtest...")
s = speedtest.Speedtest()
log.debug(f"Running test...")
s.get_servers(servers)
s.get_best_server()
s.download(threads=threads)
s.upload(threads=threads, pre_allocate=False)
results_dict = s.results.dict()
download = round(results_dict['download']/1000000, 2)
upload = round(results_dict['upload']/1000000, 2)
# download = uniform(0,2)
# upload = uniform(0,2)
break
except:
log.error(f"Test failed, try {i+1}/3", exc_info=True)
log.debug(f"{download}mbps, {upload}mbps")
entry = Entry()
entry.upload = upload
entry.download = download
entry.save()
except:
log.error("Data record error.", exc_info=True)
try:
dates, downloads, uploads = gather_data()
try:
generate_txt_output(dates, downloads, uploads)
except:
log.error("Unable to save text file.", exc_info=True)
try:
generate_plot_image(dates, downloads, uploads)
except:
log.error("Unable to save plot file.", exc_info=True)
except:
log.error("Error plotting.", exc_info=True)