# Date de la dispozitive purtabile în FHIR (Apple Health, Health Connect)

> Obțineți date de la smartwatch-uri, inele și cântare într-un fișier FHIR: ce dispozitive ajung la ce magazin de sănătate, un tabel de mapare LOINC, rezumate zilnice și un upsert testat.

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

**Pentru a introduce date de la un smartwatch, inel sau cântar inteligent într-un dosar medical, citiți-le pe telefon din magazinul de sănătate al sistemului de operare — Apple Health pe iOS, Health Connect pe Android — rezumați-le pe zi, mapați fiecare metrică la un cod LOINC și o unitate UCUM și scrieți-le ca Observații FHIR R4 marcate ca date de dispozitiv.** Citirea din magazinul de sănătate al telefonului în loc de cloud-ul fiecărui furnizor permite unei singure integrări să acopere Apple Watch, Galaxy Watch, Pixel Watch, Garmin, Fitbit, Oura și Withings, atâta timp cât persoana a permis aplicației furnizorului să partajeze. Această pagină oferă calea datelor, un tabel de mapare pe care îl puteți reutiliza, un exemplu FHIR validat și codul care a fost rulat pe platformă.

## Calea datelor

```
 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
```

Nici Apple Health, nici Health Connect nu au un API de server: datele pot fi citite doar de o aplicație de pe telefonul persoanei. Aplicația dvs. le citește, trimite valori zilnice compacte către backend-ul dvs., iar backend-ul le scrie în înregistrare.

## Ce dispozitive ajung la ce depozit de sănătate

Ce partajează fiecare furnizor se schimbă odată cu versiunile aplicațiilor; documentația proprie a furnizorului este referința.

| Dispozitiv sau aplicație | Apple Health (iOS) | Health Connect (Android) | Note |
|---|---|---|---|
| Apple Watch | Da, nativ | — | Tot ce măsoară ceasul ajunge în Apple Health |
| Samsung Galaxy Watch, Samsung Health | — | Parțial | Samsung Health decide ce tipuri exportă și cât de des; vezi [Samsung Health](https://developers.anpheros.com/ro/guides/samsung-health-fhir) |
| Pixel Watch, Fitbit | Nu există sincronizare oficială | Da, prin aplicația Fitbit ([Ajutor Google](https://support.google.com/fitbit/answer/14506680)) | |
| Garmin | Da, din Garmin Connect după fiecare sincronizare a dispozitivului | Da, Garmin Connect suportă Health Connect pe Android 14 și versiuni ulterioare ([Android Developers, august 2025](https://developer.android.com/health-and-fitness/community/newsletters/2025/08)) | Scorurile specifice Garmin, cum ar fi Body Battery, nu sunt partajate |
| Oura | Da | Da ([Oura](https://ouraring.com/blog/data-sharing-partner-integrations/)) | Readiness și alte scoruri Oura rămân în aplicația Oura |
| Withings | Da, prin Health Mate | Da ([Blog Android Developers](https://android-developers.googleblog.com/2023/03/withings-reduces-data-sync-code-with--health-and-fitness-api-health-connect.html)) | Cântare, tensiometre, ceasuri |

Două consecințe practice. În primul rând, aplicația dvs. depinde de faptul că persoana a activat partajarea în aplicația furnizorului său; procesul de onboarding ar trebui să menționeze acest lucru. În al doilea rând, depozitul de sănătate poate conține aceiași pași din două surse (un telefon și un ceas); citiți totalurile zilnice ale depozitului în sine, mai degrabă decât să adunați eșantioane, deoarece Apple Health și Health Connect deja elimină duplicatele din sursele suprapuse.

## Tabel de mapare: tip magazin de sănătate → FHIR Observation

Codurile pe care Anpheros Daily le folosește atunci când scrie date de la dispozitive purtabile într-un record FHIR:

| Metric | Apple HealthKit | Health Connect | LOINC | UCUM unit | Category |
|---|---|---|---|---|---|
| Heart rate | `heartRate` | `HeartRateRecord` | 8867-4 | `/min` | vital-signs |
| Resting heart rate | `restingHeartRate` | `RestingHeartRateRecord` | 40443-4 | `/min` | vital-signs |
| Heart rate variability | `heartRateVariabilitySDNN` | `HeartRateVariabilityRmssdRecord` | 80404-7 (doar SDNN) | `ms` | vital-signs |
| Blood oxygen (SpO₂) | `oxygenSaturation` | `OxygenSaturationRecord` | 59408-5 | `%` | vital-signs |
| Respiratory rate | `respiratoryRate` | `RespiratoryRateRecord` | 9279-1 | `/min` | vital-signs |
| Steps per day | `stepCount` | `StepsRecord` | 41950-7 | `{steps}` | activity |
| Active energy | `activeEnergyBurned` | `ActiveCaloriesBurnedRecord` | 41981-2 | `kcal` | activity |
| Sleep duration | `sleepAnalysis` (category) | `SleepSessionRecord` | 93832-4; etape 93831-6 deep, 93830-8 light, 93829-0 REM | `min` | activity |
| Body weight | `bodyMass` | `WeightRecord` | 29463-7 | `kg` | vital-signs |
| Blood pressure | `bloodPressure` (corelație) | `BloodPressureRecord` | 85354-9 cu 8480-6 și 8462-4 | `mm[Hg]` | vital-signs |
| Blood glucose (meter) | `bloodGlucose` | `BloodGlucoseRecord` | 2339-0 | `mg/dL` | vital-signs |
| Body temperature | `bodyTemperature` | `BodyTemperatureRecord` | 8310-5 | `Cel` | vital-signs |

Observați rândul heart rate variability: Apple Health stochează **SDNN**, Health Connect stochează **RMSSD**. Acestea sunt statistici diferite și nu trebuie scrise sub același cod. LOINC 80404-7 este SDNN; pentru RMSSD, Anpheros Daily folosește propriul sistem de coduri în loc să pretindă că cele două sunt identice.

## Rezumate, nu fiecare eșantion

Un ceas produce mii de eșantioane de ritm cardiac pe zi. Un dosar medical are nevoie de ceva ce o persoană sau un medic poate citi:

- **O singură Observație per metrică per zi**, cu `effectivePeriod` acoperind ziua locală a persoanei, media zilnică sau totalul în `valueQuantity` și, pentru rate, minimul și maximul ca și componente.
- **Seriile mai fine rămân acolo unde sunt utile.** Anpheros Daily păstrează rezumate ale ritmului cardiac la fiecare 4 ore pentru propriile grafice și scrie valorile zilnice în dosarul FHIR.
- **Evenimentele sunt separate.** O notificare de ritm neregulat sau o singură citire a tensiunii arteriale este propria sa Observație cu propriul timp, nu parte dintr-o medie zilnică.

Un rezumat zilnic al ritmului cardiac ca FHIR R4 (trece [validatorul 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)"}
}
```

## Scrierea valorilor zilnice fără duplicări

Telefoanele se sincronizează de mai multe ori pe zi, iar ultima valoare a unei zile se modifică până la miezul nopții. Atribuiți fiecărei Observații un identificator stabil — persoană, zi, metrică — și actualizați-o în loc să creați una nouă. Cu Anpheros TypeScript SDK, pe backend-ul dvs.:

```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 });
}
```

Executarea împotriva unei instanțe locale a platformei cu o cheie sandbox, două valori zilnice urmate de o sincronizare ulterioară a pașilor din aceeași zi au lăsat **două** Observații, cea a pașilor la versiunea 2 cu noua valoare și proveniența `v1 device apple-health · v2 device`. Istoricul păstrează valoarea anterioară, iar fiecare cititor poate vedea că datele provin de la un dispozitiv, nu de la un clinician.

În producție, utilizați limitele reale ale zilei în fusul orar al persoanei (exemplul de mai sus folosește UTC pentru concizie), așa cum fac codurile HealthKit și Health Connect de pe paginile platformei.

## Citirea datelor de pe telefon

- **iPhone și Apple Watch:** [Apple Health (HealthKit) către FHIR](https://developers.anpheros.com/ro/guides/apple-health-fhir), cu cod Swift pentru statistici zilnice.
- **Android, Wear OS, Fitbit, Garmin, Oura, Withings:** [Health Connect către FHIR](https://developers.anpheros.com/ro/guides/health-connect-fhir), cu cod Flutter care funcționează pe ambele platforme.
- **Samsung Galaxy Watch și Samsung Health:** [Samsung Health către FHIR](https://developers.anpheros.com/ro/guides/samsung-health-fhir): ce ajunge în Health Connect și ce necesită SDK-ul propriu al Samsung.

## Reguli de urmat

- **Citiți doar ceea ce folosiți** și solicitați fiecare tip separat; oamenii acordă permisiuni parțiale.
- **Etichetați sursa.** Dispozitivele purtabile ale consumatorilor nu sunt dispozitive de diagnostic. Scrieți datele lor ca date de dispozitiv (`author_type: device`) și menționați din ce aplicație provin, astfel încât un clinician să le poată evalua în mod corespunzător.
- **Respectați regulile platformei.** Ghidurile de revizuire a aplicațiilor Apple (5.1.3) interzic utilizarea datelor de sănătate pentru publicitate și stocarea informațiilor personale de sănătate în iCloud; Google Play necesită o declarație pentru aplicațiile de sănătate care utilizează Health Connect.
- **Permiteți oamenilor să se deconecteze** și să decidă dacă datele deja copiate rămân în înregistrare.

## Ce face și ce nu face Anpheros

Platforma Anpheros nu se conectează la Apple Health, Health Connect sau la niciun cloud de furnizor în mod independent: aplicația dvs. citește datele de pe telefon și le scrie prin API. Aplicația proprie Anpheros, **Anpheros Daily**, face exact acest lucru: citește Apple Health pe iPhone și Health Connect pe Android, păstrează rezumate zilnice și le scrie în registrul FHIR al persoanei cu codurile de mai sus. Conectarea dispozitivelor face parte din planurile sale Plus și Max.

## Întrebări frecvente

### Cum obțin datele de pe Apple Watch într-un server FHIR?
Citiți-le pe iPhone din Apple Health cu HealthKit (nu există un API de server), rezumați-le pe zi și permiteți backend-ului dvs. să scrie fiecare metrică ca o Observație cu un cod LOINC și o unitate UCUM, marcată ca date de dispozitiv.

### Există un API cloud pentru Health Connect sau Apple Health?
Nu. Ambele păstrează datele pe telefon; o aplicație instalată pe telefon le citește cu permisiunea persoanei. Cloud-urile furnizorilor, cum ar fi cele de la Garmin, Fitbit sau Oura, au propriile API-uri, dar citirea stocării de sănătate a telefonului acoperă majoritatea acestora cu o singură integrare.

### Ce cod LOINC ar trebui să folosesc pentru pași?
41950-7, „Numărul de pași în 24 de ore Măsurat”, cu un `effectivePeriod` zilnic. Pentru ritmul cardiac folosiți 8867-4, pentru SpO₂ 59408-5, pentru durata somnului 93832-4.

### Ar trebui să stochez fiecare eșantion de ritm cardiac în FHIR?
De obicei, nu. Un rezumat zilnic cu media, minimul și maximul este ceea ce citește o persoană sau un clinician; citirile individuale aparțin în înregistrare doar atunci când contează de la sine, cum ar fi un eveniment de ritm neregulat.

### Pot folosi un singur cod pentru HRV din Apple Health și Health Connect?
Nu. Apple Health raportează SDNN, iar Health Connect raportează RMSSD; ele măsoară lucruri diferite și necesită coduri diferite.

## Conexe

- [API-uri pentru dispozitive purtabile: Fitbit, Garmin, Oura și Withings](https://developers.anpheros.com/ro/guides/wearable-apis)
- [API pentru urmărirea sănătății](https://developers.anpheros.com/ro/guides/health-tracker-api): stocarea datelor de urmărire pe un server, cu consimțământ
- [Cum să construiești o aplicație de dosar medical personal](https://developers.anpheros.com/ro/guides/personal-health-record-app)
- [Integrări în domeniul sănătății](https://developers.anpheros.com/ro/guides/healthcare-integrations): dispozitive alături de laboratoare, clinici și aplicații
- [Sisteme de coduri FHIR](https://developers.anpheros.com/ro/guides/fhir-code-systems): LOINC și UCUM
- [Proveniența datelor medicale explicată](https://developers.anpheros.com/ro/guides/medical-data-provenance)
- [Cum să normalizezi datele medicale](https://developers.anpheros.com/ro/guides/normalize-medical-data)
- [Monitorizarea pacienților la distanță cu FHIR](https://developers.anpheros.com/ro/guides/remote-patient-monitoring-fhir): citiri individuale, webhooks și alerte
