diff --git a/README.md b/README.md
index 0cbe8a33..97ae462e 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,8 @@
- Docker Integration
- Status light + CPU, Memory & Network Reporting *(click on the status light)*
- Service Integration
- - Currently supports Sonarr, Radarr, Ombi, Emby, Jellyfin, NZBGet, ruTorrent, Portainer & PiHole
+ - Currently supports Sonarr, Radarr, Ombi, Emby, Jellyfin, NZBGet, ruTorrent
+ - Portainer, Speedtest Tracker, PiHole
* Homepage Widgets
- System Stats (Disk, CPU, Memory)
- Weather (via weatherapi.com)
diff --git a/src/components/services/widget.jsx b/src/components/services/widget.jsx
index 7e33d999..5c1dd449 100644
--- a/src/components/services/widget.jsx
+++ b/src/components/services/widget.jsx
@@ -8,6 +8,7 @@ import Docker from "./widgets/service/docker";
import Pihole from "./widgets/service/pihole";
import Rutorrent from "./widgets/service/rutorrent";
import Jellyfin from "./widgets/service/jellyfin";
+import Speedtest from "./widgets/service/speedtest";
const widgetMappings = {
docker: Docker,
@@ -20,6 +21,7 @@ const widgetMappings = {
nzbget: Nzbget,
pihole: Pihole,
rutorrent: Rutorrent,
+ speedtest: Speedtest,
};
export default function Widget({ service }) {
diff --git a/src/components/services/widgets/service/speedtest.jsx b/src/components/services/widgets/service/speedtest.jsx
new file mode 100644
index 00000000..b2e28007
--- /dev/null
+++ b/src/components/services/widgets/service/speedtest.jsx
@@ -0,0 +1,39 @@
+import useSWR from "swr";
+
+import Widget from "../widget";
+import Block from "../block";
+
+import { formatBits } from "utils/stats-helpers";
+
+export default function Speedtest({ service }) {
+ const config = service.widget;
+
+ function buildApiUrl(endpoint) {
+ const { url } = config;
+ return `${url}/api/${endpoint}`;
+ }
+
+ const { data: speedtestData, error: speedtestError } = useSWR(buildApiUrl("speedtest/latest"));
+
+ if (speedtestError) {
+ return ;
+ }
+
+ if (!speedtestData) {
+ return (
+
+
+
+
+
+ );
+ }
+
+ return (
+
+
+
+
+
+ );
+}
diff --git a/src/utils/stats-helpers.js b/src/utils/stats-helpers.js
index 281c36d0..b98f1cd7 100644
--- a/src/utils/stats-helpers.js
+++ b/src/utils/stats-helpers.js
@@ -21,3 +21,15 @@ export function formatBytes(bytes, decimals = 2) {
return parseFloat(bytes / Math.pow(k, i)).toFixed(dm) + " " + sizes[i];
}
+
+export function formatBits(bytes, decimals = 2) {
+ if (bytes === 0) return "0 Bytes";
+
+ const k = 1024;
+ const dm = decimals < 0 ? 0 : decimals;
+ const sizes = ["B", "Kb", "Mb", "Gb", "Tb", "Pb", "Eb", "Zb", "Yb"];
+
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
+
+ return parseFloat(bytes / Math.pow(k, i)).toFixed(dm) + " " + sizes[i];
+}