Specialized Turbo e-bikes in Home Assistant

I ride a Specialized Vado SL 4.0. It has a TCU (Turbo Connect Unit) that broadcasts telemetry over Bluetooth Low Energy — battery level, speed, motor power, cadence, temperature, the works. Specialized has their own Mission Control app for this, but I wanted the data in Home Assistant.

So I built a custom integration.

The protocol

Specialized’s BLE protocol isn’t documented anywhere official. Fortunately, Sepp62 had already reverse-engineered it for an ESP32 project. The protocol is called “TURBOHMI2017”, and the UUID base literally encodes this string backwards in ASCII, which I find weirdly charming. Messages are dead simple: one byte for sender, one byte for channel, and 1-4 bytes of little-endian data.

I ported the protocol to Python as specialized-turbo, an async library built on bleak. It handles scanning for nearby bikes, pairing (the bike shows a 6-digit PIN on its display), and streaming telemetry. There’s also a CLI if you want to poke around without writing code:

1$ specialized-turbo scan
2Found: My Vado SL (AA:BB:CC:DD:EE:FF)
3
4$ specialized-turbo telemetry --address AA:BB:CC:DD:EE:FF
5battery_charge_pct: 73
6speed_kmh: 24.5
7rider_power_w: 185
8motor_power_w: 120
9cadence_rpm: 82

The Home Assistant integration

ha-specialized-turbo uses Home Assistant’s Bluetooth auto-discovery. Turn on your bike near your HA instance and it shows up. Enter the pairing PIN from the TCU screen and you’re done.

It exposes 18 sensors:

All data is pushed locally over BLE. No cloud, no polling after the initial connection.

Installation

Install via HACS as a custom repository, or copy the custom_components/specialized_turbo folder into your HA config directory. You’ll need a Bluetooth adapter on your HA host and a Specialized Turbo bike from 2017 or later (Vado, Levo, Creo, or other models with a TCU).

What’s next

The library supports write commands too, like changing the assist level from HA. I haven’t wired that up to the integration yet, but it’s on the list.