Typy danych interfejsu API Google Health

Poniższa tabela zawiera pełną listę typów danych z kilkoma kolumnami, które pomogą Ci zrozumieć reprezentację każdego typu w interfejsie Google Health API, a także zakres, w jakim jest on dostępny.

Pola typu danych

Tabela typów danych interfejsu API Google Health zawiera kilka kolumn pól, które pomagają zrozumieć reprezentację i wymagania każdego typu danych. Te kolumny to:

Tabela: opisy pól typów danych interfejsu Google Health API
Pole Opis
dataType Identyfikator rozdzielony łącznikami (np. active-minutes) używany w adresach URL punktów końcowych.
Parametr filter Identyfikator oddzielony podkreśleniami (np. active_minutes) używany jako wartość parametru filtra dataType w przypadku codziennych żądań zbiorczych i żądań zbiorczych.
Typ rekordu

Określa strukturę i format zarejestrowanych danych. W praktyce odpowiada to reprezentacji zasobów punktów danych. Możliwe wartości to:

  • Interval (Oznacza pomiary zarejestrowane w określonym czasie).
  • Sample (Reprezentuje pomiary natychmiastowe).
  • Daily (Oznacza pomiary agregowane lub rejestrowane codziennie).
  • Session (Reprezentuje ciągły blok nagrania, np. trening lub sesję elektrokardiogramu (EKG)).
  • Food (Reprezentuje produkt spożywczy lub encję danych związaną z odżywianiem).
Dostępne operacje Zawiera listę metod API obsługiwanych w przypadku danego typu danych (np. list, create i rollUp).
Zakres Zakresy OAuth wymagane do uzyskania dostępu do typu danych.
Obsługa webhooków Wskazuje, że typ danych obsługuje powiadomienia w czasie rzeczywistym za pomocą webhooków, gdy synchronizowane są nowe dane.
Obsługa wartości zerowych Wskazuje, że typ danych obsługuje rejestrowanie jawnych wartości zerowych, aby odróżnić aktywną wartość zerową (np. zero aktywnych minut) od brakujących lub niezarejestrowanych danych.
Rozdzielczość przechowywania Minimalny interwał rejestrowania lub próbkowania, w którym przechowywane są punkty danych (np. 1 minuta w przypadku steps). W przypadku podsumowań oznacza to minimalny zalecany interwał windowSize, aby zapewnić równomierną agregację bez artefaktów danych podinterwału.
Zgodne urządzenia Rozwijana lista urządzeń fizycznych, które mogą rejestrować i synchronizować ten typ danych z interfejsem Google Health API (za pomocą aplikacji Fitbit).

Tabela: typy danych interfejsu Google Health API
Typ danych Dostępne
operacje
Zakres
Spalone kalorie
dataType: active-energy-burned
filter parameter: active_energy_burned
Typ rekordu: Interwał
Rozdzielczość przechowywania: 1 minuta
list, reconcile, rollup, dailyRollup .activity_and_fitness.readonly
.activity_and_fitness.writeonly
Aktywne minuty
dataType: active-minutes
filter parameter: active_minutes
Typ rekordu: Interwał
Rozdzielczość przechowywania: 1 minuta

Zgodne urządzenia

  • Fitbit Air
  • Fitbit Alta
  • Fitbit Alta HR
  • Fitbit Blaze
  • Fitbit Charge 2
  • Fitbit Charge 3
  • Fitbit Flex 2
  • Fitbit Inspire
  • Fitbit Inspire HR
  • Pixel Watch 4
list, reconcile, rollup, dailyRollup .activity_and_fitness.readonly
.activity_and_fitness.writeonly
Aktywne minuty w strefie
dataType: active-zone-minutes
filter parameter: active_zone_minutes
Typ rekordu: Interwał
Rozdzielczość przechowywania: 1 minuta

Zgodne urządzenia

list, reconcile, rollup, dailyRollup .activity_and_fitness.readonly
.activity_and_fitness.writeonly
Poziom aktywności
dataType: activity-level
filter parameter: activity_level
Typ rekordu: Interwał
lista, uzgodnienie .activity_and_fitness.readonly
.activity_and_fitness.writeonly
Wysokość
dataType: altitude
filter parameter: altitude
Typ rekordu: Interwał
Rozdzielczość przechowywania: 1 minuta
list, reconcile, rollup, dailyRollup .activity_and_fitness.readonly
.activity_and_fitness.writeonly
Glukoza we krwi
dataType: blood-glucose
filter parameter: blood_glucose
Typ rekordu: Próbka
list, get, reconcile, rollup, dailyRollup .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Tkanka tłuszczowa
dataType: body-fat
filter parameter: body_fat
Typ rekordu: Próbka

Zgodne urządzenia

list, get, reconcile, rollup, dailyRollup, create, update, batchDelete .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Kalorie w strefie tętna
dataType: calories-in-heart-rate-zone
filter parameter: calories_in_heart_rate_zone
Typ rekordu: Interwał
Rozdzielczość przechowywania: 1 minuta
rollup, dailyRollup .activity_and_fitness.readonly
.activity_and_fitness.writeonly
Temperatura ciała
dataType: core-body-temperature
filter parameter: core_body_temperature
Typ rekordu: Próbka
list, get, reconcile, rollup, dailyRollup .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Dzienna zmienność rytmu serca
dataType: daily-heart-rate-variability
filter parameter: daily_heart_rate_variability
Typ rekordu: dzienny

Zgodne urządzenia

lista, uzgodnienie .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Dzienne strefy tętna
dataType: daily-heart-rate-zones
filter parameter: daily_heart_rate_zones
Typ rekordu: dzienny
lista, uzgodnienie .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Codzienne nasycenie tlenem
dataType: daily-oxygen-saturation
filter parameter: daily_oxygen_saturation
Typ rekordu: dzienny

Zgodne urządzenia

lista, uzgodnienie .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Dzienna częstość oddechów
dataType: daily-respiratory-rate
filter parameter: daily_respiratory_rate
Typ rekordu: dzienny

Zgodne urządzenia

lista, uzgodnienie .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Dzienne tętno spoczynkowe
dataType: daily-resting-heart-rate
filter parameter: daily_resting_heart_rate
Typ rekordu: dzienny

Zgodne urządzenia

lista, uzgodnienie .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Codzienne wyliczenia temperatury snu
dataType: daily-sleep-temperature-derivations
filter parameter: daily_sleep_temperature_derivations
Typ rekordu: dzienny

Zgodne urządzenia

lista, uzgodnienie .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Dzienny pułap tlenowy
dataType: daily-vo2-max
filter parameter: daily_vo2_max
Typ rekordu: dzienny

Zgodne urządzenia

lista, uzgodnienie .activity_and_fitness.readonly
.activity_and_fitness.writeonly
Dystans
dataType: distance
filter parameter: distance
Typ rekordu: Interwał
Rozdzielczość przechowywania: 1 minuta

Zgodne urządzenia

list, reconcile, rollup, dailyRollup .activity_and_fitness.readonly
.activity_and_fitness.writeonly
Elektrokardiogram (EKG)
dataType: electrocardiogram
filter parameter: electrocardiogram
Typ rekordu: sesja

Zgodne urządzenia

lista .ecg.readonly
Ćwiczenia
dataType: exercise
filter parameter: exercise
Typ rekordu: sesja

Zgodne urządzenia

list, get, reconcile, create, update, batchDelete .activity_and_fitness.readonly
.activity_and_fitness.writeonly
Piętra
dataType: floors
filter parameter: floors
Typ rekordu: Interwał
Rozdzielczość przechowywania: 1 minuta
reconcile, rollup, dailyRollup .activity_and_fitness.readonly
.activity_and_fitness.writeonly
Jedzenie
dataType: food
filter parameter: food
Typ rekordu: jedzenie
list, get .nutrition.readonly
.nutrition.writeonly
Jednostka miary jedzenia
dataType: food-measurement-unit
filter parameter: food_measurement_unit
Typ rekordu: jedzenie

Zgodne urządzenia

list, get .nutrition.readonly
.nutrition.writeonly
Tętno
dataType: heart-rate
filter parameter: heart_rate
Typ rekordu: Próbka
Rozdzielczość przechowywania: 1 sekunda (1 s)

Zgodne urządzenia

list, reconcile, rollup, dailyRollup .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Zmienność rytmu serca
dataType: heart-rate-variability
filter parameter: heart_rate_variability
Typ rekordu: Próbka

Zgodne urządzenia

lista, uzgodnienie .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Wysokość
dataType: height
filter parameter: height
Typ rekordu: Próbka
list, get, reconcile, create, update, batchDelete .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Zapis nawodnienia
dataType: hydration-log
filter parameter: hydration_log
Typ rekordu: sesja
list, get, reconcile, rollup, dailyRollup, create, update, batchDelete .nutrition.readonly
.nutrition.writeonly
Powiadomienie o nieregularnym rytmie serca
dataType: irregular-rhythm-notification
filter parameter: irregular_rhythm_notification
Typ rekordu: sesja
lista .irn.readonly
Okres
dataType: menstrual-period
filter parameter: menstrual_period
Typ rekordu: Interwał
create, update, batchDelete .reproductive_health.writeonly
Nastroje
dataType: moods
filter parameter: moods
Typ rekordu: Próbka
create, update, batchDelete .mindfulness.writeonly
Dziennik odżywiania
dataType: nutrition-log
filter parameter: nutrition_log
Typ rekordu: sesja

Zgodne urządzenia

list, get, reconcile, rollup, dailyRollup, create, update, batchDelete .nutrition.readonly
.nutrition.writeonly
Test owulacyjny
dataType: ovulation-test
filter parameter: ovulation_test
Typ rekordu: Próbka
create, update, batchDelete .reproductive_health.writeonly
Nasycenie tlenem
dataType: oxygen-saturation
filter parameter: oxygen_saturation
Typ rekordu: Próbka

Zgodne urządzenia

lista, uzgodnienie .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Podsumowanie snu dotyczące częstości oddechów
dataType: respiratory-rate-sleep-summary
filter parameter: respiratory_rate_sleep_summary
Typ rekordu: Próbka

Zgodne urządzenia

lista, uzgodnienie .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly
Pułap tlenowy podczas biegu
dataType: run-vo2-max
filter parameter: run_vo2_max
Typ rekordu: Próbka

Zgodne urządzenia

list, reconcile, rollup, dailyRollup .activity_and_fitness.readonly
.activity_and_fitness.writeonly
Okres braku aktywności
dataType: sedentary-period
filter parameter: sedentary_period
Typ rekordu: Interwał

Zgodne urządzenia

list, reconcile, rollup, dailyRollup .activity_and_fitness.readonly
.activity_and_fitness.writeonly
Sen
dataType: sleep
filter parameter: sleep
Typ rekordu: sesja

Zgodne urządzenia

list, get, reconcile, create, update, batchDelete .sleep.readonly
.sleep.writeonly
Kroki
dataType: steps
filter parameter: steps
Typ rekordu: Interwał
Rozdzielczość przechowywania: 1 minuta

Zgodne urządzenia

list, reconcile, rollup, dailyRollup .activity_and_fitness.readonly
.activity_and_fitness.writeonly
Dane o długościach pływania
dataType: swim-lengths-data
filter parameter: swim_lengths_data
Typ rekordu: Interwał

Zgodne urządzenia

list, reconcile, rollup, dailyRollup .activity_and_fitness.readonly
.activity_and_fitness.writeonly
Objawy
dataType: symptoms
filter parameter: symptoms
Typ rekordu: Próbka
create, update, batchDelete .logged_symptoms.writeonly
Czas w strefie tętna
dataType: time-in-heart-rate-zone
filter parameter: time_in_heart_rate_zone
Typ rekordu: Interwał
Rozdzielczość przechowywania: 1 minuta
list, reconcile, rollup, dailyRollup .activity_and_fitness.readonly
.activity_and_fitness.writeonly
Wszystkie kalorie
dataType: total-calories
filter parameter: total_calories
Typ rekordu: Interwał
Rozdzielczość przechowywania: 1 minuta

Zgodne urządzenia

rollup, dailyRollup .activity_and_fitness.readonly
.activity_and_fitness.writeonly
Maksymalny pułap tlenowy VO2
dataType: vo2-max
filter parameter: vo2_max
Typ rekordu: Próbka

Zgodne urządzenia

lista, uzgodnienie .activity_and_fitness.readonly
.activity_and_fitness.writeonly
Waga
dataType: weight
filter parameter: weight
Typ rekordu: Próbka

Zgodne urządzenia

list, get, reconcile, rollup, dailyRollup, create, update, batchDelete .health_metrics_and_measurements.readonly
.health_metrics_and_measurements.writeonly

Ograniczenia zapytań

Podczas wysyłania zapytań do interfejsu API o punkty danych, zbiorcze dane lub dzienne zbiorcze dane pamiętaj o tych ograniczeniach:

  • Wymagania dotyczące filtrów: niektóre typy danych pochodnych tylko do odczytu, np.total-calories, wymagają filtra określającego czas rozpoczęcia interwału (z użyciem czasu fizycznego lub cywilnego).
  • Limity zakresu zapytań: punkty końcowe agregacji zbiorczej i dziennej agregacji zbiorczej wymuszają maksymalne limity zakresu zapytań na podstawie typu danych:
    • Maksymalny zakres zapytania to 14 dni w przypadku strumieni calories-in-heart-rate-zone, heart-rate, active-minutes i total-calories.
    • Maksymalny zakres zapytania wynosi 90 dni w przypadku wszystkich innych typów danych.
  • Rozmiar okna zbiorczego: podczas wywoływania punktu końcowego rollUp czas trwania windowSize musi wynosić co najmniej 1 sekundę ("1s"). Czas trwania krótszy niż sekunda jest odrzucany z kodem INVALID_ARGUMENT. Dodatkowo wybierz wartość windowSize równą lub większą od rozdzielczości pamięci bazowej typu danych (np. "60s" w przypadku typów danych z interwałem 1-minutowym, takich jak steps i distance), aby uniknąć nierównomiernego rozkładu w podprzedziałach. Szczegółowe informacje znajdziesz w sekcji Rozmiar okna zbiorczego i rozdzielczość pamięci masowej.

Typy danych dziennych i interwałowych

W przypadku niektórych wskaźników fizjologicznych, takich jak zmienność rytmu serca (HRV) czy nasycenie krwi tlenem (SpO2), interfejs Google Health API udostępnia 2 różne typy danych: wersję dzienną i wersję interwałową. Zrozumienie różnicy jest kluczowe przy wyborze odpowiednich danych w danym przypadku użycia:

  • Dziennie: jedno wstępnie zagregowane podsumowanie za cały dzień. Używaj tej opcji w przypadku ogólnych trendów i codziennych paneli, aby oszczędzać zasoby przetwarzania.

  • Interwał: szczegółowe pomiary o wysokiej rozdzielczości wykonywane w ciągu dnia. Używaj tej funkcji do tworzenia wykresów wahań w ciągu dnia lub przeprowadzania szczegółowych analiz godzinowych.

Dostępność danych

Aktualizacje danych użytkownika są dostępne dopiero po zsynchronizowaniu przez niego trackera aktywności lub ręcznym wprowadzeniu nowych danych w aplikacji mobilnej lub internetowej Fitbit. Urządzenie Fitbit i aplikacja mobilna Fitbit mogą automatycznie synchronizować dane co 15 minut, gdy aplikacja Fitbit jest otwarta na urządzeniu mobilnym, a oba urządzenia mają aktywne połączenie do transmisji danych i znajdują się w zasięgu Bluetooth. Jeśli użytkownik śledzi aktywność za pomocą funkcji MobileTrack, synchronizuje się ona co godzinę, o ile aplikacja jest otwarta.

Wysyłanie zapytań dotyczących danych historycznych

Jedną z głównych korzyści interfejsu Google Health API jest możliwość śledzenia wyników użytkownika i monitorowania jego parametrów życiowych przez długi czas. Możesz wysyłać zapytania o dane użytkownika z dowolnego okresu, w którym były one rejestrowane. Interfejs API nie nakłada żadnych ograniczeń na ilość danych historycznych, które może wykorzystywać Twoja aplikacja.

Wykonywanie zapytań dotyczących danych historycznych podlega jednak standardowym limitom liczby zapytań. Aby zarządzać stabilnością systemu i zapobiegać nadmiernym rozmiarom pakietów danych, interfejs Google Health API korzysta z automatycznego stronicowania z rozmiarami stron dostosowanymi do konkretnych punktów końcowych. Pamiętaj o tych ograniczeniach i zasadach działania:

  • Automatyczny podział na strony: jeśli zapytanie dotyczy długiego okresu danych, interfejs API zwróci tylko pierwszą stronę wyników do limitu rozmiaru strony dla danego punktu końcowego wraz z parametrem nextPageToken. Aby poprosić o kolejne strony, musisz użyć parametru nextPageToken.
  • Zmienne rozmiary stron: limity ograniczające zależą od punktu końcowego i typu danych. W przypadku większości typów danych rozmiar strony jest ograniczony do maksymalnie 10 tys. W przypadku niektórych typów danych, takich jak exercise i sleep, domyślny i maksymalny rozmiar strony jest ograniczony do 25. Jeśli na przykład klient poprosi o wszystkie dane o śnie z ostatnich 10 lat, interfejs API zwróci na pierwszej stronie tylko 25 sesji snu.
  • Ograniczenia zakresu dat w przypadku scalania danych: w przypadku punktów końcowych scalania i agregacji danych (np. rollUp i dailyRollUp) zakresy dat zapytań są ograniczone w zależności od typu danych:
    • Maksymalny zakres 14 dni w przypadku usług calories-in-heart-rate-zone, heart-rate, active-minutes i total-calories.
    • Maksymalny zakres 90 dni w przypadku wszystkich innych typów danych zbiorczych.

W zależności od ilości danych historycznych, których potrzebuje Twoja aplikacja, pobranie całego zbioru danych będzie wymagało sekwencyjnego przechodzenia między stronami. Pamiętaj o tym podczas projektowania procesu synchronizacji danych aplikacji.

Aby zapewnić optymalną wydajność i uniknąć błędów interfejsu API, podczas wysyłania zapytań o dane historyczne postępuj zgodnie z tymi wskazówkami:

Stopniowa synchronizacja danych (wczytywanie gorące i zimne)

  • Początkowe „gorące” wczytywanie: podczas głównej sekwencji wczytywania pobieraj i renderuj tylko dane z ostatnich 7–14 dni. Dzięki temu użytkownicy od razu widzą dane bez czekania na długotrwałe zapytania.
  • Wczytywanie „na zimno” w tle: po wyrenderowaniu głównego interfejsu użytkownika przekieruj pobieranie starszych danych historycznych do asynchronicznej kolejki o niższym priorytecie lub procesu w tle.

Dzielenie zapytań na potrzeby agregacji

  • Ponieważ punkty końcowe zbiorczych i dziennych danych zbiorczych wymuszają limit maksymalnego zakresu dat (14 lub 90 dni w zależności od typu danych), musisz podzielić duże zapytania o historyczne dane zbiorcze na mniejsze, kolejne przedziały czasu mieszczące się w tych limitach.
  • Bezpiecznie grupuj lub sekwencjonuj te zapytania, aby zachować limity współbieżności i utrzymywać stałe wskaźniki postępu interfejsu.

Wykorzystywanie wstępnie zagregowanych podsumowań

Zmień strukturę paneli Ogółem i wykresów trendów, aby korzystać z wstępnie zagregowanych punktów końcowych podsumowania (np. DailyRollUpDataPoints). Znacznie zmniejszy to obciążenie obliczeniowe backendu i czas przesyłania danych do klienta.

Odporna obsługa błędów (inteligentne ponawianie)

  • W przypadku przekroczenia ograniczania liczby żądań (429 Too Many Requests) i limitów czasu bramy serwera (504 Gateway Timeout) stosuj ścisłe wzrastający czas do ponowienia. Nigdy nie ponawiaj od razu prób wysyłania dużych, nieudanych ładunków. Natychmiastowe ponawianie prób zwiększa przeciążenie backendu i pogarsza działanie systemu.

Dostęp innej firmy

Urządzenia Fitbit nie mogą komunikować się bezpośrednio z aplikacjami ani usługami innych firm. Te urządzenia są przeznaczone do komunikacji i synchronizacji wyłącznie z aplikacją mobilną Fitbit.

Urządzenie synchronizuje dane automatycznie przez cały dzień, gdy aplikacja Fitbit jest otwarta, lub co 15 minut, jeśli Bluetooth jest aktywny, a aplikacja działa w tle. Po zakończeniu procesu synchronizacji dane są udostępniane usługom innych firm za pomocą interfejsu Google Health API.

Standardy odległości

Odległości ćwiczeń, np. elevationGainMillimeters, są mierzone w milimetrach jako jednostce standardowej z tych powodów:

  1. Zachowanie precyzji danych: najważniejszym powodem używania milimetrów jest zapewnienie, że nie utracimy precyzji danych, które odczytujemy i udostępniamy. Używanie precyzyjnej jednostki, takiej jak milimetry, pozwala nam przedstawiać pomiary z dużą dokładnością.
  2. Standaryzacja: milimetry to standardowa jednostka miary w naszych usługach. Ta spójność zapewnia deweloperom jednolite wrażenia podczas korzystania z różnych części interfejsu API.
  3. Szerokie wsparcie dla systemów pomiarowych: używanie jednostki podstawowej, takiej jak milimetry, ułatwia programistom przeliczanie na dowolną inną wybraną jednostkę, niezależnie od tego, czy pracują z systemem metrycznym, imperialnym czy innym systemem pomiarowym.

Zmienna długość dnia

Interfejs Health API traktuje czas priorytetowo, aby uwzględniać czas użytkownika i zmienną długość dnia spowodowaną zmianą czasu lub podróżą. Każdy punkt danych jest przechowywany z fizyczną sygnaturą czasową UTC i przesunięciem względem czasu UTC aktywnym w momencie zdarzenia. Dzięki temu system może:

  • Przypisz zdarzenie do konkretnego momentu w czasie.
  • Popraw czas, aby dopasować go do lokalnego kontekstu użytkownika na potrzeby agregacji.

Czas letni

Gdy następuje zmiana czasu na letni, „cofnięcie” zegara powoduje, że dzień kalendarzowy trwa 25 godzin, a podsumowanie za ten dzień będzie zawierać dane z 25 godzin. „Przesunięcie do przodu” powoduje, że dzień trwa 23 godziny, a czas wraca do czasu standardowego.

Podróże

Podróżowanie między strefami czasowymi może powodować jeszcze większe różnice w fizycznym czasie trwania jednego dnia kalendarzowego.

Użyj punktu końcowego dailyRollUp, aby uwzględnić różnice w strefach czasowych. Automatycznie przypisuje dane do dnia kalendarzowego, w którym zostały zarejestrowane, zgodnie z czasem lokalnym użytkownika, skutecznie „łącząc” dzień pomimo zmian stref czasowych.