| import streamlit as st |
| import speedtest |
| import plotly.graph_objects as go |
| import time |
|
|
| |
| def get_speed(): |
| st.spinner("Testing your internet speed...") |
| speed_test = speedtest.Speedtest() |
|
|
| |
| try: |
| speed_test.get_best_server() |
| except speedtest.ConfigRetrievalError: |
| st.error("Error retrieving configuration from Speedtest servers. Please check your network.") |
| return None, None, None |
|
|
| |
| download_speeds = [] |
| upload_speeds = [] |
|
|
| for _ in range(3): |
| download_speeds.append(speed_test.download() / 1_000_000) |
| upload_speeds.append(speed_test.upload() / 1_000_000) |
| time.sleep(1) |
|
|
| |
| avg_download_speed = sum(download_speeds) / len(download_speeds) |
| avg_upload_speed = sum(upload_speeds) / len(upload_speeds) |
|
|
| |
| ping = speed_test.results.ping |
|
|
| return avg_download_speed, avg_upload_speed, ping |
|
|
| |
| def plot_speedometer(speed, speed_type): |
| fig = go.Figure(go.Indicator( |
| mode="gauge+number", |
| value=speed, |
| title={'text': f"{speed_type} Speed (Mbps)"}, |
| gauge={ |
| 'axis': {'range': [None, 100]}, |
| 'bar': {'color': "lightblue"}, |
| 'steps': [ |
| {'range': [0, 20], 'color': "red"}, |
| {'range': [20, 50], 'color': "yellow"}, |
| {'range': [50, 100], 'color': "green"} |
| ], |
| 'threshold': { |
| 'line': {'color': "black", 'width': 4}, |
| 'thickness': 0.75, |
| 'value': speed |
| } |
| } |
| )) |
| fig.update_layout(height=300) |
| st.plotly_chart(fig) |
|
|
| |
| def main(): |
| st.title("Internet Speed Test") |
| st.write("Press the button below to test your download and upload speeds.") |
|
|
| |
| if st.button("Start Speed Test"): |
| download_speed, upload_speed, ping = get_speed() |
|
|
| |
| if download_speed is None or upload_speed is None: |
| return |
|
|
| |
| st.subheader(f"Download Speed: {download_speed:.2f} Mbps") |
| st.subheader(f"Upload Speed: {upload_speed:.2f} Mbps") |
| st.subheader(f"Ping: {ping} ms") |
|
|
| |
| plot_speedometer(download_speed, "Download") |
| plot_speedometer(upload_speed, "Upload") |
|
|
| if __name__ == "__main__": |
| main() |
|
|