7

The APIs documentation says that, to get a result like the Google Fit App, one should request the steps of the derived:com.google.step_count.delta:com.google.android.gms:estimated_steps datasource https://developers.google.com/fit/scenarios/read-daily-step-total https://developers.google.com/fit/faq#get-step-count

In practice, it mostly seems right but, occasionaly, the results are way off.

Doing some tests, I noticed that, sometimes, using the derived:com.google.step_count.delta:com.google.android.gms:merge_step_deltas datasource gets me better results or, at least, values more similar to the ones showed in the Google Fit app.

I think though that, if a user uses more devices to count the steps, this datasource will get me all the steps combined and that's wrong.

Is it correct to use the estimated_steps datasource or should I switch to the merge_step_deltas one? Or is it something else I can do to get the correct number of steps?

Real example

A client's steps don't match with the ones showed by the Google Fit app.

Here are his datasources list

{
  "dataSource": [
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "duration", 
            "format": "integer"
          }
        ], 
        "name": "com.google.active_minutes"
      }, 
      "dataStreamName": "from_activity<-merge_activity_segments", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.active_minutes:com.google.android.gms:from_activity<-merge_activity_segments", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "duration", 
            "format": "integer"
          }
        ], 
        "name": "com.google.active_minutes"
      }, 
      "dataStreamName": "from_steps<-estimated_steps", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.active_minutes:com.google.android.gms:from_steps<-estimated_steps", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "duration", 
            "format": "integer"
          }
        ], 
        "name": "com.google.active_minutes"
      }, 
      "dataStreamName": "merge_active_minutes", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.active_minutes:com.google.android.gms:merge_active_minutes", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "activity", 
            "format": "integer"
          }
        ], 
        "name": "com.google.activity.segment"
      }, 
      "dataStreamName": "merge_activity_segments", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.activity.segment:com.google.android.gms:merge_activity_segments", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "activity", 
            "format": "integer"
          }
        ], 
        "name": "com.google.activity.segment"
      }, 
      "dataStreamName": "platform_activity_segments", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.activity.segment:com.google.android.gms:platform_activity_segments", 
      "type": "derived"
    }, 
    {
      "dataStreamName": "activity_from_steps", 
      "dataType": {
        "field": [
          {
            "name": "activity", 
            "format": "integer"
          }
        ], 
        "name": "com.google.activity.segment"
      }, 
      "dataQualityStandard": [], 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "device": {
        "model": "SM-A600FN", 
        "version": "", 
        "type": "phone", 
        "uid": "324bd687", 
        "manufacturer": "samsung"
      }, 
      "dataStreamId": "derived:com.google.activity.segment:com.google.android.gms:samsung:SM-A600FN:324bd687:activity_from_steps", 
      "type": "derived"
    }, 
    {
      "dataStreamName": "from_activity_samples<-derived:com.google.activity.samples:com.google.android.gms:samsung:SM-A600FN:324bd687:detailed", 
      "dataType": {
        "field": [
          {
            "name": "activity", 
            "format": "integer"
          }
        ], 
        "name": "com.google.activity.segment"
      }, 
      "dataQualityStandard": [], 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "device": {
        "model": "SM-A600FN", 
        "version": "", 
        "type": "phone", 
        "uid": "324bd687", 
        "manufacturer": "samsung"
      }, 
      "dataStreamId": "derived:com.google.activity.segment:com.google.android.gms:samsung:SM-A600FN:324bd687:from_activity_samples<-derived:com.google.activity.samples:com.google.android.gms:samsung:SM-A600FN:324bd687:detailed", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "calories", 
            "format": "floatPoint"
          }
        ], 
        "name": "com.google.calories.expended"
      }, 
      "dataStreamName": "from_activities", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.calories.expended:com.google.android.gms:from_activities", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "calories", 
            "format": "floatPoint"
          }
        ], 
        "name": "com.google.calories.expended"
      }, 
      "dataStreamName": "merge_calories_expended", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.calories.expended:com.google.android.gms:merge_calories_expended", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "calories", 
            "format": "floatPoint"
          }
        ], 
        "name": "com.google.calories.expended"
      }, 
      "dataStreamName": "platform_calories_expended", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.calories.expended:com.google.android.gms:platform_calories_expended", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "intensity", 
            "format": "floatPoint"
          }
        ], 
        "name": "com.google.heart_minutes"
      }, 
      "dataStreamName": "from_activity<-merge_activity_segments", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.heart_minutes:com.google.android.gms:from_activity<-merge_activity_segments", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "intensity", 
            "format": "floatPoint"
          }
        ], 
        "name": "com.google.heart_minutes"
      }, 
      "dataStreamName": "from_heart_rate<-merge_heart_rate_bpm", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.heart_minutes:com.google.android.gms:from_heart_rate<-merge_heart_rate_bpm", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "intensity", 
            "format": "floatPoint"
          }
        ], 
        "name": "com.google.heart_minutes"
      }, 
      "dataStreamName": "from_steps<-estimated_steps", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.heart_minutes:com.google.android.gms:from_steps<-estimated_steps", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "intensity", 
            "format": "floatPoint"
          }
        ], 
        "name": "com.google.heart_minutes"
      }, 
      "dataStreamName": "merge_heart_minutes", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.heart_minutes:com.google.android.gms:merge_heart_minutes", 
      "type": "derived"
    }, 
    {
      "dataStreamName": "soft_step_counter", 
      "dataType": {
        "field": [
          {
            "name": "steps", 
            "format": "integer"
          }
        ], 
        "name": "com.google.step_count.cumulative"
      }, 
      "dataQualityStandard": [], 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "device": {
        "model": "SM-A600FN", 
        "version": "", 
        "type": "phone", 
        "uid": "324bd687", 
        "manufacturer": "samsung"
      }, 
      "dataStreamId": "derived:com.google.step_count.cumulative:com.google.android.gms:samsung:SM-A600FN:324bd687:soft_step_counter", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "steps", 
            "format": "integer"
          }
        ], 
        "name": "com.google.step_count.delta"
      }, 
      "dataStreamName": "estimated_steps", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.step_count.delta:com.google.android.gms:estimated_steps", 
      "type": "derived"
    }, 
    {
      "dataQualityStandard": [], 
      "dataType": {
        "field": [
          {
            "name": "steps", 
            "format": "integer"
          }
        ], 
        "name": "com.google.step_count.delta"
      }, 
      "dataStreamName": "merge_step_deltas", 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "dataStreamId": "derived:com.google.step_count.delta:com.google.android.gms:merge_step_deltas", 
      "type": "derived"
    }, 
    {
      "dataStreamName": "derive_step_deltas<-derived:com.google.step_count.cumulative:com.google.android.gms:samsung:SM-A600FN:324bd687:soft_step_counter", 
      "dataType": {
        "field": [
          {
            "name": "steps", 
            "format": "integer"
          }
        ], 
        "name": "com.google.step_count.delta"
      }, 
      "dataQualityStandard": [], 
      "application": {
        "packageName": "com.google.android.gms"
      }, 
      "device": {
        "model": "SM-A600FN", 
        "version": "", 
        "type": "phone", 
        "uid": "324bd687", 
        "manufacturer": "samsung"
      }, 
      "dataStreamId": "derived:com.google.step_count.delta:com.google.android.gms:samsung:SM-A600FN:324bd687:derive_step_deltas<-derived:com.google.step_count.cumulative:com.google.android.gms:samsung:SM-A600FN:324bd687:soft_step_counter", 
      "type": "derived"
    }, 
    {
      "name": "Generic ANT+ Sensor", 
      "dataStreamName": "AntPlus.0.124", 
      "dataType": {
        "field": [
          {
            "name": "steps", 
            "format": "integer"
          }
        ], 
        "name": "com.google.step_count.delta"
      }, 
      "dataQualityStandard": [], 
      "application": {
        "packageName": "com.dsi.ant.plugins.antplus"
      }, 
      "dataStreamId": "raw:com.google.step_count.delta:com.dsi.ant.plugins.antplus:AntPlus.0.124", 
      "type": "raw"
    }
  ]
}

On the day of May 2nd, the app shows something like 15000 steps (matched by the merge_step_deltas datasource) while requesting the steps from the estimated_steps datasource gets me about 7000 steps.

derived:com.google.step_count.delta:com.google.android.gms:estimated_steps

{
  "bucket": [
    {
      "startTimeMillis": "1556748000000", 
      "endTimeMillis": "1556834400000", 
      "dataset": [
        {
          "dataSourceId": "derived:com.google.step_count.delta:com.google.android.gms:aggregated", 
          "point": [
            {
              "startTimeNanos": "1556748469517481594", 
              "originDataSourceId": "derived:com.google.step_count.cumulative:com.google.android.gms:samsung:SM-A600FN:4dc460aaeb28b288:soft_step_counter", 
              "endTimeNanos": "1556831065968126307", 
              "value": [
                {
                  "mapVal": [], 
                  "intVal": 7601
                }
              ], 
              "dataTypeName": "com.google.step_count.delta"
            }
          ]
        }
      ]
    }
  ]
}

derived:com.google.step_count.delta:com.google.android.gms:merge_step_deltas

{
  "bucket": [
    {
      "startTimeMillis": "1556748000000", 
      "endTimeMillis": "1556834400000", 
      "dataset": [
        {
          "dataSourceId": "derived:com.google.step_count.delta:com.google.android.gms:aggregated", 
          "point": [
            {
              "startTimeNanos": "1556748469517481594", 
              "originDataSourceId": "derived:com.google.step_count.cumulative:com.google.android.gms:samsung:SM-A600FN:4dc460aaeb28b288:soft_step_counter", 
              "endTimeNanos": "1556831065968126307", 
              "value": [
                {
                  "mapVal": [], 
                  "intVal": 15368
                }
              ], 
              "dataTypeName": "com.google.step_count.delta"
            }
          ]
        }
      ]
    }
  ]
}
Mr. V
  • 71
  • 6
  • 2
    Can I ask where you got the documentation for `dataSourceId` values you have used or how you figured out what values to use? Can't find any documentation on these anywhere! – James Allen Nov 22 '20 at 17:30
  • @JamesAllen Try this link https://developers.google.com/fit/rest/v1/data-sources#get_a_particular_data_source – sjmach Nov 26 '20 at 17:25
  • @JamesAllen This will surely work -> https://developers.google.com/fit/rest/v1/reference/users/dataSources/get – sjmach Nov 26 '20 at 17:36
  • @sjmach thank you, it looks like I have to call the API to get a list of valid IDs? Strange that there isn't a documented list somewhere – James Allen Dec 02 '20 at 12:51
  • @JamesAllen There isn't a documented list because sources are dynamic, they can be added or removed by the end user by connecting or disconnecting play store apps that serve as a datasource. – JPR Dec 04 '20 at 15:23

0 Answers0