This is an ESPHome port of peteh/pacekeeper. The original project uses PlatformIO + MQTT; this fork replaces that with an ESPHome custom component and the native Home Assistant API — no MQTT broker required.
PaceKeeper is an ESPHome firmware for an ESP32 that connects via Bluetooth LE to your WalkingPad and exposes the treadmill to Home Assistant via the native ESPHome API.
See the video on Youtube:
- PitPat-T01 Treadmill – Superun BA06-B1 [AliExpress]
- Likely also: other Superun / Deerrun OEM models (same protocol)
- An ESP32 with Bluetooth (e.g. Wemos S3 Mini, nodemcu-32s, …) [AliExpress] [Amazon]
- ESPHome — either the Home Assistant add-on, the standalone Docker container, or the CLI
- Home Assistant with the ESPHome integration (auto-discovered once the device joins WiFi)
Once flashed, the device shows up in Home Assistant with:
| Entity | Type | Notes |
|---|---|---|
| Speed | sensor | current speed in km/h (from treadmill) |
| Distance | sensor | total distance km |
| Duration | sensor | run duration in seconds |
| Calories | sensor | kcal |
| Steps | sensor | step count (not all firmwares report) |
| Max Speed | sensor | device-configured maximum |
| Firmware Version | sensor | treadmill firmware |
| State | text_sensor | running / paused / stopped / … |
| Speed Control | number | slider 0–6 km/h → sets target speed |
| Start-Stop | button | toggles between run and stop |
Install nRF Connect on your phone.
- Turn the treadmill on with the power switch
- Either initialize it with the vendor app or follow the Cloud Free Usage section below
- Open nRF Connect — the device should appear as
PitPat-T01 - Write down the Bluetooth address (e.g.
AA:BB:CC:11:22:33)
Copy the template and fill in your values:
cp esphome/esp-pacekeeper.example.yaml esphome/esp-pacekeeper.yamlThe real esp-pacekeeper.yaml is gitignored so your credentials stay out of the repo. Edit these fields:
wifi:
ssid: "<your WiFi SSID>"
password: "<your WiFi password>"
ble_client:
- mac_address: "AA:BB:CC:11:22:33" # ← your treadmill's BT address
id: walkingpad_bleThe YAML references a local custom component at esphome/components/walkingpad/. Copy that directory to your ESPHome config as well so the final layout is:
<esphome-config>/
├── esp-pacekeeper.yaml
└── components/
└── walkingpad/
├── __init__.py
└── walkingpad.h
From the ESPHome CLI or the Home Assistant add-on UI:
esphome run esp-pacekeeper.yamlFirst flash needs to be over USB; subsequent updates work over-the-air.
Once the device joins WiFi, Home Assistant auto-discovers it via the ESPHome integration — just accept the new device.
- The custom component
walkingpad(inesphome/components/walkingpad/) inherits fromble_client.BLEClientNodeand owns the WRITE characteristic0xFBA1, which it uses to send 23-byte speed/stop commands with an XOR checksum. - Notifications on
0xFBA2are subscribed via ESPHome's built-inble_clientsensor platform. Its lambda forwards the raw bytes intoWalkingPadComponent::on_notification()where the binary packet is parsed and the entities are published. - Connection parameters (15–30 ms interval, 6 s supervision timeout) match what the original vendor firmware expects — this prevents the ~30 s idle disconnect.
You'll get a remote with it; it has +, −, and play/pause buttons. However, when you turn it on, it initially reacts with a long, annoying sound to any button press. When you turn it on with the power button, it will also take a while before showing display information, first lighting up all display segments.
That's where you strike.
Turn it on and quickly press (+); you will be greeted with a short sound. Then press −, −, −, +, +, wait 20 seconds, turn it off and on again. It should now display something else, and you can start using it.
- Turn on using the
powerswitch on the device - Press
-on the remote 3× - Press
+on the remote 1× - Press
+on the remote for 3 seconds
Each correct input will be confirmed by a short, happy sound. Each incorrect input will be confirmed by a long, annoying sound.
I built this with the help of many other people who put effort into reverse-engineering the Bluetooth protocol.
Python web interface to control the treadmill via Bluetooth but for another model.
GitHub project: https://github.com/azmke/pitpat-treadmill-control
A Web Bluetooth app written in JavaScript. Fully supports the B1 as well.
GitHub project: https://github.com/KeiranY/PitPat-WebBT/
There is some work in a B1 sub-branch.
Source file: https://github.com/cagnulein/qdomyos-zwift/blob/master/src/devices/deeruntreadmill/deerruntreadmill.cpp
Deerrun and Superun seem to use the same OEM hardware, so it's likely that those devices might work as well.

