10m 120W, 5x(3m 250W, 2m 130W), 5m 100W 5m 50%-75%, 2x(20m 90%, 5m 55%), 10m free
Bluetooth sensor dashboard and trainer control
Connect several Bluetooth sensors at once — heart-rate straps, power meters, speed and cadence sensors, running pods, smart trainers, thermometers, Xiaomi LYWSD03MMC, scales — with big live numbers and graphs, one timeline logged in the browser and exported as CSV, and ERG workouts and free rides on an FTMS trainer.
Added
How to use it
A dashboard and logger for Bluetooth LE sensors. Each sensor gets a card with large live numbers, its battery level and a two-minute graph; every reading from every sensor goes into one timeline that you can export as CSV or save as a session file to look at later. With an FTMS smart trainer it also sets the resistance: hold a power (ERG), ride a gradient, or run a structured workout typed as one line of text.
For anything it doesn’t recognise, the card lists the device’s services and links to the Bluetooth LE explorer, which can read and write any characteristic.
How to use it
-
Add sensors. Press Add sensor… and pick one in the browser’s chooser; it lists devices that advertise a sensor service this page understands. Do it again for the next one — they all stay connected. Any device… shows everything nearby. Simulated sensors adds a pretend trainer, power meter and heart-rate strap, so you can try it all without hardware.
-
Watch the cards. What each one shows depends on what the sensor sends:
-
Heart rate (0x180D): beats per minute, the zone as a percentage of your maximum heart rate, and HRV as RMSSD over the last 30 RR intervals (only straps that send RR intervals; beats under 300 or over 2000 ms, or that jump more than 25%, are left out).
-
Cycling power (0x1818): watts, 3 s and 10 s averages, W/kg, normalized power, work in kJ, pedal balance (if the meter reports the left pedal’s share), cadence from crank revolutions and speed from wheel revolutions.
-
Speed and cadence (0x1816) and running speed and cadence (0x1814; pace, stride length, distance). Revolution counters and event times are worked out across their rollover; cadence holds between crank events and drops to zero three seconds after the last one.
-
Environmental sensing (0x181A: temperature, humidity, pressure), health thermometer (0x1809), weight scale (0x181D) and battery (0x180F, on every card that has it).
-
Xiaomi LYWSD03MMC. With the stock firmware it connects and reads the value the thermometer notifies (temperature, humidity and the coin cell’s voltage). With the ATC or pvvx custom firmware it connects to the standard environmental sensing service. Listen to advertisements reads the custom firmware’s broadcasts (ATC1441, pvvx and BTHome v2 formats) without connecting, so one page can watch a whole house of them — but only in browsers with the experimental
requestLEScan(Chrome with chrome://flags/#enable-experimental-web-platform-features); the button only appears where it works. Stock-firmware advertisements are encrypted and not read. -
Smart trainer (FTMS, 0x1826): power, cadence, speed and resistance from its indoor bike data.
-
-
Ride. On Trainer & workouts, choose ERG and a wattage, Free ride and drag the grade (with headwind, rolling resistance and Cw), or Resistance and a level. The page asks the trainer for control first, and again if the trainer says it has lost it; every request and the trainer’s answer go into the event log.
-
Run a workout. Type it as steps separated by commas or new lines, a duration then a target:
Durations are
30s,5m,1h,1m30sor1:30; targets are watts (250W), a percentage of your FTP (85%), a ramp (100-200W) orfree(the grade slider instead). Repeats nest. The page shows the profile coloured by power zone, a big countdown for the step, the target against your 3-second power (from a power meter if you have one, otherwise the trainer), and the next step. Pause takes the trainer off the target; Skip step moves on. -
Keep the log. Readings, workout targets and steps, and events are kept in this browser (IndexedDB) as they arrive, so reloading the page carries on with the same session. Export CSV gives one row a second with a column per sensor value (the mean over that second); CSV, every reading has one line per reading, RR intervals included. The session file (JSON) can be opened again under Sessions to see the timeline and a summary: minimum, mean and maximum of each value, and NP, kJ, IF and TSS for power.
Settings holds your FTP, maximum heart rate, weight and wheel circumference (pick a tyre size or type the roll-out in millimetres), and shares metric or imperial units with the other bike tools. To find your FTP and zones, use cycling power, climbing and zones; for the gear a cadence needs, the gearing calculator.
Notes
-
Resistance level is sent as a signed 16-bit value in tenths, as FTMS 1.0.1 and most trainers expect; the slider’s range comes from the trainer’s own supported resistance level range when it publishes one.
-
Simulation’s Cw is ½·ρ·CdA in kg/m — about 0.51 for a rider on the hoods at sea level.
-
Normalized power is the fourth-power mean of the 30-second rolling average of power resampled to one value a second; gaps longer than five seconds (a pause or a dropout) are skipped, not filled in.
-
Heart-rate zones are the five-zone percent-of-maximum model; power zones are Coggan’s seven.
Browser support
Web Bluetooth works in Chrome, Edge and Opera on Windows, macOS, ChromeOS and Android, over HTTPS.
On Linux it needs chrome://flags/#enable-experimental-web-platform-features. Firefox and Safari,
and every browser on iPhone and iPad, don’t support it; there you can still use the simulated
sensors, plan workouts, and open session files. Reading advertisements (requestLEScan) needs
the experimental flag everywhere. Where the browser offers getDevices(), a Reconnect button
brings back sensors you used before without the chooser.
Feedback is a gift. Something to improve, a feature to add, or a bug? Tell me.
Runs entirely in your browser; nothing you type leaves this page.