99
1010A custom [ Home Assistant] ( https://www.home-assistant.io/ ) integration for
1111the [ Rouvy] ( https://rouvy.com/ ) indoor cycling platform, installable via
12- [ HACS] ( https://hacs.xyz/ ) . Exposes 33 sensors and 3 services covering your
12+ [ HACS] ( https://hacs.xyz/ ) . Exposes 41 sensors and 6 services covering your
1313Rouvy profile, activity history, training zones, challenges, routes, events,
1414career progress, and social data.
1515
@@ -33,96 +33,107 @@ All sensors are created under the `sensor.rouvy_*` entity namespace.
3333
3434### Profile
3535
36- | Sensor | Unit | Description |
37- | --- | --- | --- |
38- | ` weight ` | kg | Current body weight |
39- | ` height ` | cm | Current height |
40- | ` ftp ` | W | Functional Threshold Power |
41- | ` max_heart_rate ` | bpm | Maximum heart rate |
42- | ` units ` | — | Preferred unit system (METRIC / IMPERIAL) |
43- | ` name ` | — | Display name |
36+ | Sensor | Unit | Example | Description |
37+ | --- | --- | --- | --- |
38+ | ` weight ` | kg | ` 85.5 ` | Current body weight |
39+ | ` height ` | cm | ` 178.0 ` | Current height |
40+ | ` ftp ` | W | ` 250 ` | Functional Threshold Power |
41+ | ` max_heart_rate ` | bpm | ` 185 ` | Maximum heart rate |
42+ | ` units ` | — | ` METRIC ` | Preferred unit system |
43+ | ` name ` | — | ` John Doe ` | Display name |
44+ | ` ftp_source ` | — | ` MANUAL ` | How FTP was determined (MANUAL / AUTO) |
45+ | ` country ` | — | ` US ` | Account country code |
4446
4547### Weekly Activity Stats
4648
4749Current-week ride totals, refreshed each update cycle.
4850
49- | Sensor | Unit | Description |
50- | --- | --- | --- |
51- | ` weekly_distance ` | km | Total ride distance this week |
52- | ` weekly_elevation ` | m | Total elevation gain this week |
53- | ` weekly_calories ` | kcal | Total calories burned this week |
54- | ` weekly_ride_time ` | min | Total ride time this week |
55- | ` weekly_ride_count ` | — | Number of rides this week |
56- | ` weekly_training_score ` | — | Cumulative training score this week |
51+ | Sensor | Unit | Example | Description |
52+ | --- | --- | --- | --- |
53+ | ` weekly_distance ` | km | ` 142.3 ` | Total ride distance this week |
54+ | ` weekly_elevation ` | m | ` 1,850 ` | Total elevation gain this week |
55+ | ` weekly_calories ` | kcal | ` 3,200 ` | Total calories burned this week |
56+ | ` weekly_ride_time ` | min | ` 285 ` | Total ride time this week |
57+ | ` weekly_ride_count ` | — | ` 5 ` | Number of rides this week |
58+ | ` weekly_training_score ` | — | ` 312 ` | Cumulative training score this week |
5759
5860### Last Activity
5961
60- | Sensor | Unit | Description |
61- | --- | --- | --- |
62- | ` last_activity_title ` | — | Title of the most recent ride |
63- | ` last_activity_distance ` | km | Distance of the most recent ride |
64- | ` last_activity_duration ` | min | Duration of the most recent ride |
65- | ` last_activity_date ` | timestamp | Start time of the most recent ride |
66- | ` total_activities ` | — | Total number of recent activities |
62+ | Sensor | Unit | Example | Description |
63+ | --- | --- | --- | --- |
64+ | ` last_activity_title ` | — | ` Col du Galibier ` | Title of the most recent ride |
65+ | ` last_activity_distance ` | km | ` 34.2 ` | Distance of the most recent ride |
66+ | ` last_activity_duration ` | min | ` 62 ` | Duration of the most recent ride |
67+ | ` last_activity_date ` | timestamp | ` 2026-04-10T07:30:00Z ` | Start time of the most recent ride |
68+ | ` total_activities ` | — | ` 247 ` | Total number of recent activities |
6769
6870### Challenges
6971
70- | Sensor | Unit | Description |
71- | --- | --- | --- |
72- | ` active_challenges ` | — | Number of currently active challenges |
73- | ` completed_challenges ` | — | Number of completed challenges |
72+ | Sensor | Unit | Example | Description |
73+ | --- | --- | --- | --- |
74+ | ` active_challenges ` | — | ` 3 ` | Number of currently active challenges |
75+ | ` completed_challenges ` | — | ` 12 ` | Number of completed challenges |
7476
7577### Training Zones
7678
77- | Sensor | Unit | Description |
78- | --- | --- | --- |
79- | ` power_zones ` | — | Power zone boundaries (% of FTP) |
80- | ` hr_zones ` | — | Heart rate zone boundaries (% of max HR) |
79+ | Sensor | Unit | Example | Description |
80+ | --- | --- | --- | --- |
81+ | ` power_zones ` | — | ` [55, 75, 90, 105, 120] ` | Power zone boundaries (% of FTP) |
82+ | ` hr_zones ` | — | ` [60, 70, 80, 90] ` | Heart rate zone boundaries (% of max HR) |
8183
8284### Connected Apps
8385
84- | Sensor | Unit | Description |
85- | --- | --- | --- |
86- | ` connected_apps_count ` | — | Total connected third-party apps |
87- | ` connected_apps_active ` | — | Number of actively connected apps |
86+ | Sensor | Unit | Example | Description |
87+ | --- | --- | --- | --- |
88+ | ` connected_apps_count ` | — | ` 3 ` | Total connected third-party apps |
89+ | ` connected_apps_active ` | — | ` 2 ` | Number of actively connected apps |
8890
8991### Routes
9092
91- | Sensor | Unit | Description |
92- | --- | --- | --- |
93- | ` favorite_routes_count ` | — | Number of favorited routes |
94- | ` routes_online_riders ` | — | Total online riders across favorites |
93+ | Sensor | Unit | Example | Description |
94+ | --- | --- | --- | --- |
95+ | ` favorite_routes_count ` | — | ` 15 ` | Number of favorited routes |
96+ | ` routes_online_riders ` | — | ` 42 ` | Total online riders across favorites |
9597
9698### Events
9799
98- | Sensor | Unit | Description |
99- | --- | --- | --- |
100- | ` upcoming_events_count ` | — | Number of upcoming events |
101- | ` next_event ` | — | Title of the next scheduled event |
100+ | Sensor | Unit | Example | Description |
101+ | --- | --- | --- | --- |
102+ | ` upcoming_events_count ` | — | ` 2 ` | Number of upcoming events |
103+ | ` next_event ` | — | ` Saturday Morning Race ` | Title of the next scheduled event |
104+ | ` next_event_time ` | — | ` 2026-04-12T08:00:00Z ` | Start time of the next scheduled event |
102105
103106### Career
104107
105- | Sensor | Unit | Description |
106- | --- | --- | --- |
107- | ` career_level ` | — | Current career level |
108- | ` total_xp ` | — | Total experience points |
109- | ` total_coins ` | — | Total coins earned |
110- | ` career_total_distance ` | km | Lifetime total distance ridden |
108+ | Sensor | Unit | Example | Description |
109+ | --- | --- | --- | --- |
110+ | ` career_level ` | — | ` 25 ` | Current career level |
111+ | ` total_xp ` | — | ` 9,500 ` | Total experience points |
112+ | ` total_coins ` | — | ` 3,200 ` | Total coins earned |
113+ | ` career_total_distance ` | km | ` 4,567.8 ` | Lifetime total distance ridden |
114+ | ` career_total_elevation ` | m | ` 45,678 ` | Lifetime total elevation gained |
115+ | ` career_total_time ` | h | ` 312.5 ` | Lifetime total ride time |
116+ | ` career_total_activities ` | — | ` 247 ` | Lifetime total activity count |
117+ | ` career_achievements ` | — | ` 37 ` | Total achievements unlocked |
118+ | ` career_trophies ` | — | ` 12 ` | Total trophies earned |
111119
112120### Social
113121
114- | Sensor | Unit | Description |
115- | --- | --- | --- |
116- | ` friends_count ` | — | Total number of friends |
117- | ` friends_online ` | — | Number of friends currently online |
122+ | Sensor | Unit | Example | Description |
123+ | --- | --- | --- | --- |
124+ | ` friends_count ` | — | ` 42 ` | Total number of friends |
125+ | ` friends_online ` | — | ` 5 ` | Number of friends currently online |
118126
119127## Services
120128
121- | Service | Description |
122- | --- | --- |
123- | ` rouvy.update_weight ` | Update body weight (kg) in Rouvy |
124- | ` rouvy.update_height ` | Update height (cm) in Rouvy |
125- | ` rouvy.update_settings ` | Update arbitrary profile settings (key-value pairs) |
129+ | Service | Parameters | Description |
130+ | --- | --- | --- |
131+ | ` rouvy.update_weight ` | ` weight ` (kg) | Update body weight in Rouvy |
132+ | ` rouvy.update_height ` | ` height ` (cm) | Update height in Rouvy |
133+ | ` rouvy.update_settings ` | ` settings ` (object) | Update arbitrary profile settings |
134+ | ` rouvy.register_challenge ` | ` slug ` | Register for a challenge |
135+ | ` rouvy.register_event ` | ` event_id ` (UUID) | Register for an event |
136+ | ` rouvy.unregister_event ` | ` event_id ` (UUID) | Unregister from an event |
126137
127138## Logging
128139
@@ -173,7 +184,7 @@ uv run rouvy-api raw user-settings/zones.data # Raw decoded response
173184
174185` ` ` bash
175186uv sync # Install all dependencies
176- uv run pytest -q # Run tests (438 tests)
187+ uv run pytest -q # Run tests (457 tests)
177188uv run ruff check . # Lint
178189uv run ruff format . # Format
179190` ` `
@@ -187,7 +198,7 @@ custom_components/rouvy/ # HA integration (HACS root)
187198│ ├── parser.py # Turbo-stream response decoder
188199│ └── ...
189200├── coordinator.py # DataUpdateCoordinator
190- ├── sensor.py # 33 sensor descriptions
201+ ├── sensor.py # 41 sensor descriptions
191202├── config_flow.py # HA config flow + reauth
192203├── services.yaml # Service definitions
193204└── manifest.json # HA integration manifest
0 commit comments