AI-generated Key Takeaways
-
Sleep data in Google Fit is represented by sessions of type
sleep. -
Sleep sessions can include sleep stages, providing granular details like light, deep, or REM sleep.
-
Sleep stage values are represented by integers, with a table mapping values to types like Awake, Sleep, Out-of-bed, Light sleep, Deep sleep, and REM.
-
The Android sample code demonstrates retrieving sleep sessions and their detailed sleep stages using
SessionsClient. -
Retrieving sleep data using the REST API involves listing sessions with
activityType=72and then aggregating data for sleep stages usingcom.google.sleep.segment.
Sleep is represented by sessions
of type sleep.
Sessions can optionally contain sleep stages, which have more granular details
about sleep data. For example, if it was light, deep or REM
sleep:
Sleep stage values
| Sleep stage type | Value |
|---|---|
| Awake (during sleep cycle) | 1 |
| Sleep | 2 |
| Out-of-bed | 3 |
| Light sleep | 4 |
| Deep sleep | 5 |
| REM | 6 |
The write sleep data guide shows how both granular and non-granular sleep data is represented in Fit.
Android
The follow samples uses a SessionClient to retrieve data from Fit, for both cases.
val SLEEP_STAGE_NAMES = arrayOf( "Unused", "Awake (during sleep)", "Sleep", "Out-of-bed", "Light sleep", "Deep sleep", "REM sleep" ) val request = SessionReadRequest.Builder() .readSessionsFromAllApps() // By default, only activity sessions are included, so it is necessary to explicitly // request sleep sessions. This will cause activity sessions to be *excluded*. .includeSleepSessions() // Sleep segment data is required for details of the fine-granularity sleep, if it is present. .read(DataType.TYPE_SLEEP_SEGMENT) .setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS) .build() sessionsClient.readSession(request) .addOnSuccessListener { response -> for (session in response.sessions) { val sessionStart = session.getStartTime(TimeUnit.MILLISECONDS) val sessionEnd = session.getEndTime(TimeUnit.MILLISECONDS) Log.i(TAG, "Sleep between $sessionStart and $sessionEnd") // If the sleep session has finer granularity sub-components, extract them: val dataSets = response.getDataSet(session) for (dataSet in dataSets) { for (point in dataSet.dataPoints) { val sleepStageVal = point.getValue(Field.FIELD_SLEEP_SEGMENT_TYPE).asInt() val sleepStage = SLEEP_STAGE_NAMES[sleepStageVal] val segmentStart = point.getStartTime(TimeUnit.MILLISECONDS) val segmentEnd = point.getEndTime(TimeUnit.MILLISECONDS) Log.i(TAG, "\t* Type $sleepStage between $segmentStart and $segmentEnd") } } } }
REST
Retrieving sleep sessions using the REST API is a two stage process:
Retrieve a list of sessions setting the
activityTypeparameter to72(SLEEP). Note: You can use astartTimeandendTime, or use a pageToken to retrieve new sessions since the previous request.HTTP method
GETRequest URL
https://www.googleapis.com/fitness/v1/users/me/sessions?startTime=2019-12-05T00:00.000Z&endTime=2019-12-17T23:59:59.999Z&activityType=72Response
An example Session response might be:
{ "session": [ { "id": "Sleep1575505620000", "name": "Sleep", "description": "", "startTimeMillis": "1575505620000", "endTimeMillis": "1575526800000", "modifiedTimeMillis": "1575590432413", "application": { "packageName": "com.example.sleep_tracker" }, "activityType": 72 // Sleep }, { "id": "Run2939075083", "name": "Mud", "description": "", "startTimeMillis": "1576594403000", "endTimeMillis": "1576598754000", "modifiedTimeMillis": "1576616010143", "application": { "packageName": "com.example.run_tracker" }, "activityType": 8 // Running } ], "deletedSession": [], "nextPageToken": "1576598754001" }To obtain details of sleep stages for each session (if present), use the following request for each session in the filtered list:
HTTP method
POSTRequest URL
https://www.googleapis.com/fitness/v1/users/userId/dataset:aggregateRequest body
{ "aggregateBy": [ { "dataTypeName": "com.google.sleep.segment" } ], "endTimeMillis": 1575609060000, "startTimeMillis": 1575591360000 }Response
If your request was successful, you'll get a
200 OKHTTP response status code. The response body contains a JSON representation of activity segments that comprise the sleep session. EachintValrepresents the sleep activity type{ "bucket": [ { "startTimeMillis": "1575591360000", "endTimeMillis": "1575609060000", "dataset": [ { "point": [ { "startTimeNanos": "1575591360000000000", "endTimeNanos": "1575595020000000000", "dataTypeName": "com.google.sleep.segment", "originDataSourceId": "...", "value": [ { "intVal": 4, // Light sleep "mapVal": [] } ] }, { "startTimeNanos": "1575595020000000000", "endTimeNanos": "1575596220000000000", "dataTypeName": "com.google.sleep.segment", "originDataSourceId": "...", "value": [ { "intVal": 1, // Sleep "mapVal": [] } ] }, // .... more datapoints { "startTimeNanos": "1575605940000000000", "endTimeNanos": "1575609060000000000", "dataTypeName": "com.google.sleep.segment", "originDataSourceId": "...", "value": [ { "intVal": 4, // Light sleep "mapVal": [] } ] } ] } ] } ] }