AnpherosAnpheros PlatformDevelopers

Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card

Дані з носимих пристроїв у FHIR (Apple Health, Health Connect)

Отримайте дані з смарт-годинників, кілець та ваг до запису FHIR: які пристрої досягають якого сховища здоров'я, таблиця мапування LOINC, щоденні підсумки та протестований upsert.

Щоб отримати дані зі смарт-годинника, кільця або смарт-ваг у медичний запис, прочитайте їх на телефоні зі сховища даних про здоров'я операційної системи — Apple Health на iOS, Health Connect на Android — узагальніть їх за день, зіставте кожну метрику з кодом LOINC та одиницею UCUM, і запишіть їх як FHIR R4 Observations, позначені як дані пристрою. Читання зі сховища даних про здоров'я телефону замість хмари кожного постачальника дозволяє одній інтеграції охопити Apple Watch, Galaxy Watch, Pixel Watch, Garmin, Fitbit, Oura та Withings, за умови, що особа дозволила своєму постачальнику ділитися даними. Ця сторінка надає шлях даних, таблицю зіставлення, яку ви можете повторно використовувати, валідний приклад FHIR та код, який був запущений на платформі.

Шлях даних

 watch, ring, scale ──► vendor app (Garmin Connect, Fitbit, Oura, Withings, Samsung Health…)
                              │  shares, with the person's permission
                              ▼
                 Apple Health (iOS)  /  Health Connect (Android)
                              │  your app reads, with the person's permission, on the phone
                              ▼
                 your app ──► your backend ──► FHIR R4 Observations in the person's record

Ні Apple Health, ні Health Connect не мають серверного API: дані можуть бути прочитані лише додатком на телефоні користувача. Ваш додаток читає їх, надсилає стислі щоденні значення на ваш бекенд, а бекенд записує їх до запису.

Які пристрої досягають яких сховищ даних про здоров'я

Те, чим ділиться кожен постачальник, змінюється з версіями додатків; довідником є ​​власна документація постачальника.

Пристрій або додаток Apple Health (iOS) Health Connect (Android) Примітки
Apple Watch Так, нативно — Все, що вимірює годинник, потрапляє в Apple Health
Samsung Galaxy Watch, Samsung Health — Частково Samsung Health вирішує, які типи даних експортувати та як часто; див. Samsung Health
Pixel Watch, Fitbit Немає офіційної синхронізації Так, через додаток Fitbit (Довідка Google)
Garmin Так, з Garmin Connect після кожної синхронізації пристрою Так, Garmin Connect підтримує Health Connect на Android 14 і новіших версіях (Android Developers, серпень 2025) Специфічні для Garmin показники, такі як Body Battery, не передаються
Oura Так Так (Oura) Показники Readiness та інші показники Oura залишаються в додатку Oura
Withings Так, через Health Mate Так (Блог Android Developers) Ваги, монітори артеріального тиску, годинники

Два практичні наслідки. По-перше, ваш додаток залежить від того, чи ввімкнув користувач спільний доступ у своєму додатку постачальника; під час онбордингу слід про це повідомити. По-друге, сховище даних про здоров'я може містити ті самі кроки з двох джерел (телефон і годинник); читайте власні щоденні підсумки сховища, а не додавайте зразки, оскільки Apple Health і Health Connect вже дедуплікують перекриваються джерела.

Таблиця відповідності: тип сховища даних про здоров'я → FHIR Observation

Коди, які Anpheros Daily використовує під час запису даних з носимих пристроїв до запису FHIR:

Метрика Apple HealthKit Health Connect LOINC UCUM unit Категорія
Частота серцевих скорочень heartRate HeartRateRecord 8867-4 /min vital-signs
Частота серцевих скорочень у стані спокою restingHeartRate RestingHeartRateRecord 40443-4 /min vital-signs
Варіабельність серцевого ритму heartRateVariabilitySDNN HeartRateVariabilityRmssdRecord 80404-7 (тільки SDNN) ms vital-signs
Кисень у крові (SpO₂) oxygenSaturation OxygenSaturationRecord 59408-5 % vital-signs
Частота дихання respiratoryRate RespiratoryRateRecord 9279-1 /min vital-signs
Кількість кроків на день stepCount StepsRecord 41950-7 {steps} activity
Активна енергія activeEnergyBurned ActiveCaloriesBurnedRecord 41981-2 kcal activity
Тривалість сну sleepAnalysis (категорія) SleepSessionRecord 93832-4; стадії 93831-6 глибокий, 93830-8 легкий, 93829-0 REM min activity
Вага тіла bodyMass WeightRecord 29463-7 kg vital-signs
Артеріальний тиск bloodPressure (кореляція) BloodPressureRecord 85354-9 з 8480-6 та 8462-4 mm[Hg] vital-signs
Рівень глюкози в крові (глюкометр) bloodGlucose BloodGlucoseRecord 2339-0 mg/dL vital-signs
Температура тіла bodyTemperature BodyTemperatureRecord 8310-5 Cel vital-signs

Зверніть увагу на рядок "Варіабельність серцевого ритму": Apple Health зберігає SDNN, а Health Connect зберігає RMSSD. Це різні статистичні показники, і їх не слід записувати під одним кодом. LOINC 80404-7 — це SDNN; для RMSSD Anpheros Daily використовує власну систему кодів, а не вдає, що ці два показники однакові.

Підсумки, а не кожен зразок

Годинник генерує тисячі вимірювань пульсу на день. Медична карта потребує чогось, що людина або лікар можуть прочитати:

Щоденний підсумок пульсу у форматі FHIR R4 (проходить валідатор FHIR R4):

{
  "resourceType": "Observation",
  "status": "final",
  "identifier": [{"system": "https://your-app.test/fhir/sid/daily-wearable", "value": "p-123:2026-10-01:heart_rate"}],
  "category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "vital-signs"}]}],
  "code": {"coding": [{"system": "http://loinc.org", "code": "8867-4", "display": "Heart rate"}]},
  "subject": {"reference": "Patient/p-123"},
  "effectivePeriod": {"start": "2026-10-01T00:00:00-04:00", "end": "2026-10-02T00:00:00-04:00"},
  "valueQuantity": {"value": 71.4, "unit": "/min", "system": "http://unitsofmeasure.org", "code": "/min"},
  "component": [
    {"code": {"text": "minimum"}, "valueQuantity": {"value": 52, "unit": "/min", "system": "http://unitsofmeasure.org", "code": "/min"}},
    {"code": {"text": "maximum"}, "valueQuantity": {"value": 138, "unit": "/min", "system": "http://unitsofmeasure.org", "code": "/min"}}
  ],
  "device": {"display": "Apple Watch (via Apple Health)"}
}

Запис щоденних значень без дублікатів

Телефони синхронізуються кілька разів на день, і останнє значення за день змінюється до півночі. Надайте кожному Observation стабільний ідентифікатор — особа, день, метрика — та оновлюйте його замість створення нового. За допомогою Anpheros TypeScript SDK на вашому бекенді:

import { Anpheros, apiKey } from '@anpheros/sdk';

const anpheros = new Anpheros({ auth: apiKey(process.env.ANPHEROS_KEY!) });

// What the phone sends: one value per metric per local day
type DailyValue = { metric: 'heart_rate' | 'steps'; day: string; value: number; min?: number; max?: number };

const CODES = {
  heart_rate: { code: '8867-4', display: 'Heart rate', unit: '/min', category: 'vital-signs' },
  steps: { code: '41950-7', display: 'Number of steps in 24 hour Measured', unit: '{steps}', category: 'activity' },
} as const;

// One Observation per person, metric and day: re-sending a day updates it instead of adding a copy.
async function upsertDaily(patientId: string, v: DailyValue, source: string) {
  const c = CODES[v.metric];
  const identifier = { system: 'https://your-app.test/fhir/sid/daily-wearable', value: `${patientId}:${v.day}:${v.metric}` };
  const resource: any = {
    resourceType: 'Observation', status: 'final',
    identifier: [identifier],
    category: [{ coding: [{ system: 'http://terminology.hl7.org/CodeSystem/observation-category', code: c.category }] }],
    code: { coding: [{ system: 'http://loinc.org', code: c.code, display: c.display }] },
    subject: { reference: `Patient/${patientId}` },
    effectivePeriod: { start: `${v.day}T00:00:00Z`, end: `${v.day}T23:59:59Z` },
    valueQuantity: { value: v.value, unit: c.unit, system: 'http://unitsofmeasure.org', code: c.unit },
  };
  if (v.min !== undefined && v.max !== undefined) {
    resource.component = [
      { code: { text: 'minimum' }, valueQuantity: { value: v.min, unit: c.unit, system: 'http://unitsofmeasure.org', code: c.unit } },
      { code: { text: 'maximum' }, valueQuantity: { value: v.max, unit: c.unit, system: 'http://unitsofmeasure.org', code: c.unit } },
    ];
  }
  const found = await anpheros.fhir.search('Observation', { identifier: `${identifier.system}|${identifier.value}` });
  const existing = found.entry?.[0]?.resource;
  return existing
    ? anpheros.fhir.update({ ...resource, id: existing.id }, { author_type: 'device' })
    : anpheros.fhir.create(resource, { author_type: 'device', source_system: source });
}

Запуск проти локального екземпляра платформи з ключем sandbox, два щоденних значення, за якими слідує пізніша синхронізація кроків за той самий день, залишили два Observation, причому кроки мають версію 2 з новим значенням, а provenance v1 device apple-health · v2 device. Історія зберігає попереднє значення, і кожен читач може бачити, що дані надійшли від пристрою, а не від клініциста.

У продакшені використовуйте реальні межі дня в часовій зоні особи (у наведеному вище прикладі для стислості використовується UTC), як це робить код HealthKit та Health Connect на сторінках платформи.

Читання даних з пристроїв

Правила, яких варто дотримуватися

Що робить і чого не робить Anpheros

Платформа Anpheros самостійно не підключається до Apple Health, Health Connect або будь-якої хмари постачальника: ваш додаток читає дані з телефону та записує їх через API. Власний додаток Anpheros, Anpheros Daily, робить саме це: він читає Apple Health на iPhone та Health Connect на Android, зберігає щоденні підсумки та записує їх до FHIR-запису особи з наведеними вище кодами. Підключення пристроїв є частиною планів Plus та Max.

Часті запитання

Як отримати дані Apple Watch на сервер FHIR?

Прочитайте їх на iPhone з Apple Health за допомогою HealthKit (серверного API немає), узагальніть їх за день, і нехай ваш бекенд запише кожну метрику як Observation з кодом LOINC та одиницею UCUM, позначивши її як дані пристрою.

Чи існує хмарний API для Health Connect або Apple Health?

Ні. Обидва зберігають дані на телефоні; додаток, встановлений на телефоні, читає їх за дозволом користувача. Хмарні сервіси постачальників, такі як Garmin, Fitbit або Oura, мають власні API, але читання сховища даних телефону охоплює більшість з них однією інтеграцією.

Який код LOINC слід використовувати для кроків?

41950-7, "Number of steps in 24 hour Measured", з щоденним effectivePeriod. Для пульсу використовуйте 8867-4, для SpO₂ 59408-5, для тривалості сну 93832-4.

Чи варто зберігати кожен зразок пульсу в FHIR?

Зазвичай ні. Щоденний звіт із середнім, мінімальним та максимальним значенням — це те, що читає користувач або лікар; окремі показники належать до запису лише тоді, коли вони мають самостійне значення, наприклад, подія нерегулярного ритму.

Чи можу я використовувати один код для HRV з Apple Health та Health Connect?

Ні. Apple Health повідомляє про SDNN, а Health Connect — про RMSSD; вони вимірюють різні речі та потребують різних кодів.

Пов'язане

Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card

Product updates by email

New features, guides and the end of the beta. One email a month at most.

Send me occasional Anpheros Platform updates by email (new features, API changes, guides). I'll confirm by email and can unsubscribe in one click from any email. Privacy