Ookla Speedtest Integration - Release 3.0.0
Ookla Speedtest Integration - Release 3.0.0
Release Date: March 19, 2026
Shell Scripts Replaced with Pure Python
This is a major release that eliminates all shell script dependencies. The integration now uses pure Python for binary setup, speedtest execution, and server listing — permanently fixing the PermissionError: [Errno 13] / 500 Internal Server Error that affected HACS installs, git-cloned installs, and Docker volume mounts where chmod has no effect.
Why This Matters
Previous versions relied on .sh scripts that required execute permissions. Despite fixes in v2.3.8 and v2.3.9, some environments (read-only mounts, certain NAS devices, restrictive Docker configs) simply cannot set execute bits. By removing shell scripts entirely, the integration now works everywhere Python runs — no filesystem permission workarounds needed.
What Changed
| Before (v2.x) | After (v3.0.0) |
|---|---|
setup_speedtest.sh downloads the binary via curl + tar |
binary_manager.py downloads via urllib.request + tarfile |
launch_speedtest.sh runs the speedtest |
Direct binary invocation from Python |
list_servers.sh lists servers |
Already used direct binary invocation (no change) |
Binary stored in /config/shell/ |
Binary stored in integration folder (custom_components/ookla_speedtest/bin/) |
ensure_shell_scripts_executable() called on every startup |
Removed entirely — no longer needed |
Automatic Migration
Updating to v3.0.0 is seamless:
- Existing binary users — The integration downloads a fresh copy to its own
bin/directory on first run. No manual action needed. - Legacy cleanup — Old files (
launch_speedtest.sh,list_servers.sh,setup_speedtest.sh,speedtest.bin) are automatically removed from/config/shell/. The/config/shell/directory itself is left untouched in case other tools use it. - Config entries — No schema changes. Your server selection, schedule, and all settings carry over as-is.
Technical Details
New file: binary_manager.py
detect_arch()— Mapsplatform.machine()to Ookla's naming (x86_64, aarch64, armhf, armel, i386)async_setup_speedtest(hass)— Async entry point that creates thebin/directory, validates or downloads the binary, and accepts the Ookla license/GDPR- Legacy file cleanup for users upgrading from v2.x
Modified files:
__init__.py— Speedtest runs via[speedtest.bin, --accept-license, --accept-gdpr, --format=json]directly, no bash wrapperconfig_flow.py— Setup callsasync_setup_speedtest()instead of shelling out tosetup_speedtest.shhelpers.py— Removedensure_shell_scripts_executable()(no longer needed)const.py— RemovedLAUNCH_SCRIPT_PATHandINTEGRATION_SHELL_DIRconstants; updatedSPEEDTEST_BIN_PATHto integration folder
Deleted files:
shell/setup_speedtest.shshell/launch_speedtest.shshell/list_servers.sh
Installation
Update to version 3.0.0 via HACS. The integration will automatically set up the binary and clean up legacy files on next restart.
No manual steps required.