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

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

Source: https://developers.anpheros.com/uk/guides/wearable-data-fhir

**Щоб отримати дані зі смарт-годинника, кільця або смарт-ваг у медичний запис, прочитайте їх на телефоні зі сховища даних про здоров'я операційної системи — 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](https://developers.anpheros.com/uk/guides/samsung-health-fhir) |
| Pixel Watch, Fitbit | Немає офіційної синхронізації | Так, через додаток Fitbit ([Довідка Google](https://support.google.com/fitbit/answer/14506680)) | |
| Garmin | Так, з Garmin Connect після кожної синхронізації пристрою | Так, Garmin Connect підтримує Health Connect на Android 14 і новіших версіях ([Android Developers, серпень 2025](https://developer.android.com/health-and-fitness/community/newsletters/2025/08)) | Специфічні для Garmin показники, такі як Body Battery, не передаються |
| Oura | Так | Так ([Oura](https://ouraring.com/blog/data-sharing-partner-integrations/)) | Показники Readiness та інші показники Oura залишаються в додатку Oura |
| Withings | Так, через Health Mate | Так ([Блог Android Developers](https://android-developers.googleblog.com/2023/03/withings-reduces-data-sync-code-with--health-and-fitness-api-health-connect.html)) | Ваги, монітори артеріального тиску, годинники |

Два практичні наслідки. По-перше, ваш додаток залежить від того, чи ввімкнув користувач спільний доступ у своєму додатку постачальника; під час онбордингу слід про це повідомити. По-друге, сховище даних про здоров'я може містити ті самі кроки з двох джерел (телефон і годинник); читайте власні щоденні підсумки сховища, а не додавайте зразки, оскільки 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 використовує власну систему кодів, а не вдає, що ці два показники однакові.

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

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

- **Одне спостереження (Observation) на показник на день**, з `effectivePeriod`, що охоплює місцевий день людини, середньоденне значення або загальне значення в `valueQuantity`, а для показників частоти – мінімальне та максимальне значення як компоненти.
- **Більш детальні серії залишаються там, де вони корисні.** Anpheros Daily зберігає 4-годинні підсумки пульсу для власних діаграм і записує щоденні значення до FHIR-запису.
- **Події окремо.** Сповіщення про нерегулярний ритм або окреме вимірювання артеріального тиску є окремим спостереженням (Observation) зі своїм часом, а не частиною середньоденного значення.

Щоденний підсумок пульсу у форматі FHIR R4 (проходить валідатор [FHIR R4](https://developers.anpheros.com/tools/fhir-validator)):

```json
{
  "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 на вашому бекенді:

```ts
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 на сторінках платформи.

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

- **iPhone та Apple Watch:** [Apple Health (HealthKit) до FHIR](https://developers.anpheros.com/uk/guides/apple-health-fhir), з кодом на Swift для щоденної статистики.
- **Android, Wear OS, Fitbit, Garmin, Oura, Withings:** [Health Connect до FHIR](https://developers.anpheros.com/uk/guides/health-connect-fhir), з кодом на Flutter, який працює на обох платформах.
- **Samsung Galaxy Watch та Samsung Health:** [Samsung Health до FHIR](https://developers.anpheros.com/uk/guides/samsung-health-fhir): що потрапляє до Health Connect і що потребує власного SDK від Samsung.

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

- **Читайте лише те, що використовуєте**, і запитуйте кожен тип окремо; люди надають часткові дозволи.
- **Позначайте джерело.** Носимі пристрої споживачів не є діагностичними пристроями. Записуйте їхні дані як дані пристрою (`author_type: device`) і вказуйте, з якого додатка вони надійшли, щоб клініцист міг зважити їх відповідно.
- **Дотримуйтесь правил платформи.** Правила перегляду додатків Apple (5.1.3) забороняють використовувати дані про стан здоров'я для реклами та зберігати особисту інформацію про стан здоров'я в iCloud; Google Play вимагає декларацію додатків про стан здоров'я для додатків, які використовують 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; вони вимірюють різні речі та потребують різних кодів.

## Пов'язане

- [API для носимих пристроїв: Fitbit, Garmin, Oura та Withings](https://developers.anpheros.com/uk/guides/wearable-apis)
- [API трекерів здоров'я](https://developers.anpheros.com/uk/guides/health-tracker-api): зберігання даних трекерів на сервері за згодою
- [Як створити додаток для особистої медичної картки](https://developers.anpheros.com/uk/guides/personal-health-record-app)
- [Інтеграції в галузі охорони здоров'я](https://developers.anpheros.com/uk/guides/healthcare-integrations): пристрої поряд з лабораторіями, клініками та додатками
- [Системи кодування FHIR](https://developers.anpheros.com/uk/guides/fhir-code-systems): LOINC та UCUM
- [Пояснення походження медичних даних](https://developers.anpheros.com/uk/guides/medical-data-provenance)
- [Як нормалізувати медичні дані](https://developers.anpheros.com/uk/guides/normalize-medical-data)
- [Дистанційний моніторинг пацієнтів за допомогою FHIR](https://developers.anpheros.com/uk/guides/remote-patient-monitoring-fhir): окремі показники, вебхуки та сповіщення
