I have been having a play around to see what kind of information can be gathered from the strava api for us that cycle.
This is far from what i want to be able to do with the API, but i see this as a start.
If anyone else is interested in helping me please drop me a pm. I would love to make a component that we can easily integrate into HAS.
Get yourself to [https://www.strava.com/settings/api]
The access token retrieved via settings -> My API Application this has the default permission.Which means we can only read public activities.
I am working on writing some simple scripts to delete and upload new activities, which requires an access token with write permission.
This guide details how to quickly get a Strava access token with write access.
-
Log into the strava website https://www.strava.com/settings/api
-
Create an application “My Api Application”
-
Make sure that you set the callback URL a localhost. We will need to to obtain an authorization token.
Take note of your client ID, these will be needed later
Leave strava tab open
Create a request URL for Strava authorization, where the base URL is https://www.strava.com/oauth/authorize and parameters are:
client_id: your application’s ID, obtained during registration
redirect_uri: URL to which the user will be redirected with the authorization code.
response_type: must be 'code'
scope: 'public', 'write', 'view_private', 'view_private,write'
Example
"http://www.strava.com/oauth/authorize?client_id="CLIENT_ID_FROM_API_SETTINGS"&response_type=code&redirect_uri=http://localhost/exchange_token&approval_prompt=force&scope=write"
- Copy the above URL with your “Client_id” into a browser.
- Browser will 404 as http://localhost/exchange_token does not exist.
- Authorize the app on Strava.
- Copy the authorization URL from previous step and take note of the code.
Example
“http://localhost/exchange_token?state=&code=43534534534543gfgfdgdfgdfgd43563”
Authentication
Use a rest client. Perform a POST to https://www.strava.com/oauth/token as documented in the API. ]
client_id: your application’s ID, obtained during registration
client_secret: your application’s secret, obtained during registration
code: authorization code from last step
Example
$ curl -X POST https://www.strava.com/oauth/token
-F client_id="CLIENT_ID_FROM_API_SETTINGS
-F client_secret="CLIENT_SECRET_FROM_API_SETTINGS
-F code=“CODE_FROM_PREVIOUS_STEP”
Retreiving data.
Strava offers many endpoints, i have only played around with a couple at the moment.
/v3/oauth
/v3/athlete
/v3/athletes/:id
/v3/activities/:id
/v3/activities/:id/streams
/v3/clubs/:id
/v3/segments/:id
/v3/segments/:id/leaderboard
/v3/segments/:id/all_efforts
/v3/uploads
Example using v3/activities
Using a rest client perform a GET with the following
https://www.strava.com/api/v3/activities?access_token=“YOUR_API_KEY”
Information returned from the api
Any of the fields can be used and brought into the front end in HomeAssistant using the rest platform. It is worth referring to the documentation when picking up fields in Home assistant. https://strava.github.io/api/v3/activities/
As an example elevation_gain is reported in meters, but on my mobile app it is reported in ft. It bugged me the wrong measurement being reported in Home Assistant on the front end.
total_elevation_gain: float
meters
Using a value template you can convert metres to feet and vice versa.
value_template: '{{ value_json[0].elev_high | multiply(3.280839895) | round(1) }}'
1 Meter = 3.28084 feet
Home Assistant Configuration
Sensor.yaml sample
Picking up the elev_high parameter from the api which is reported in metres, but converted to FT
sensor.yaml
- platform: rest
name: strava_elev_high
resource: https://www.strava.com/api/v3/activities
method: GET
headers:
Authorization:YOUR_API_TOKEN
value_template: '{{ value_json[0].elev_high | multiply(3.280839895) | round(1) }}'
unit_of_measurement: ft
scan_interval: 300
Automation based on sensor
- alias: Notify Last Ride Mileage
trigger:
- platform: state
entity_id: sensor.strava_last_ride_milage
condition:
condition: template
value_template: "{{ states('sensor.strava_last_ride_mileage) != 'unknown' }}"
action:
- service: notify.notifier_telegram
data_template:
message: Ride uploaded to strava
i hope to add more sensors so that when a message is sent to a notifier we can have a summary of information such as heart rate, average, speed etc. These sensors can then be used with tts script.
Very quick write up so apologies for any mistakes