Disable Victron's built-in BLE services on Venus OS to prevent them from interfering with third-party Bluetooth services.
Two stock Venus OS services cause serious problems for any third-party BLE service:
| Service | Problem |
|---|---|
dbus-ble-sensors |
Uses raw HCI sockets to scan, bypassing BlueZ entirely. This corrupts BlueZ's internal discovery state, causing org.bluez.Error.InProgress for any other service using the D-Bus API — even when Discovering is False. The corruption is continuous (re-applied every 10 seconds) and the only recovery is an adapter power-cycle or bluetoothd restart, both of which drop all BLE connections. |
vesmart-server |
Forcibly disconnects all BLE devices every ~60 seconds and runs its own scan cycle, causing further InProgress collisions and connection drops. |
Upstream issues:
- victronenergy/venus#1587 — vesmart forcibly disconnects all BLE devices
- victronenergy/venus#1597 — dbus-ble-sensors raw HCI scanning corrupts BlueZ discovery state
- Saves current D-Bus settings (
/Settings/Services/BleSensorsand/Settings/Services/Bluetooth) to/data/disable-victron-bluetooth.state - Disables both services in the Venus OS UI via D-Bus (sets to 0)
- Stops each service if running (
svc -d) - Makes run/start scripts non-executable so they can't be restarted
by daemontools or the
bt-configudev hotplug script
--restore reverses all of this: re-enables the scripts, starts the
services, and restores the D-Bus settings to their original values
(read from the saved state file, not hardcoded).
The root partition is read-only on Venus OS — the script temporarily remounts it read-write, modifies the scripts, and restores read-only. All steps are idempotent — safe to run repeatedly.
Run directly on the Cerbo without downloading:
wget -qO- https://raw.githubusercontent.com/TechBlueprints/disable-victron-bluetooth/main/disable-victron-bluetooth.sh | shTo restore:
wget -qO- https://raw.githubusercontent.com/TechBlueprints/disable-victron-bluetooth/main/disable-victron-bluetooth.sh | sh -s -- --restoreOr copy a file to the Cerbo and run it:
# Bash version
scp disable-victron-bluetooth.sh root@cerbo:/tmp/
ssh root@cerbo 'sh /tmp/disable-victron-bluetooth.sh'
# Python version
scp disable-victron-bluetooth.py root@cerbo:/tmp/
ssh root@cerbo 'python3 /tmp/disable-victron-bluetooth.py'To re-enable both services:
sh disable-victron-bluetooth.sh --restore
# or
python3 disable-victron-bluetooth.py --restoreBoth scripts are designed to be easy to embed. Each file contains the full Apache 2.0 license header so it can be used standalone.
. /path/to/disable-victron-bluetooth.sh
disable_victron_ble # disable both services
restore_victron_ble # re-enable both services
disable_service dbus-ble-sensors # disable just onefrom disable_victron_bluetooth import disable_victron_ble, restore_victron_ble
disable_victron_ble() # disable both services
restore_victron_ble() # re-enable both servicesOr call individual services:
from disable_victron_bluetooth import disable_service, restore_service
disable_service("dbus-ble-sensors")
restore_service("vesmart-server")Venus OS firmware updates restore the read-only root partition, which
re-enables these services. You should call disable_victron_ble on boot
(e.g., from /data/rc.local or from your service's install script) to
keep them disabled after updates.
See Venus OS: Root Access for full details on customizing a GX device, boot hooks, the read-only rootfs, and creating persistent patches.
A non-production Cerbo GX (einstein) is available for testing at
root@dev-cerbo. Use this for rapid iteration when physical device
access isn't needed — it runs the same Venus OS and service stack as
production units but can be freely modified without risk.
ssh root@dev-cerboThe production Cerbo (root@cerbo) should only be used for final
validation.
Apache License 2.0 — see LICENSE.