AnpherosAnpheros PlatformDevelopers

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

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

Introduceți date de la smartwatch, inele și cântare într-un dosar FHIR: ce dispozitive ajung la ce store de sănătate, o tabelă de mapare LOINC, rezumate zilnice și un upsert testat.

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
Pixel Watch, Fitbit Nu există sincronizare oficială Da, prin aplicația Fitbit (Ajutor Google)
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) Scorurile specifice Garmin, cum ar fi Body Battery, nu sunt partajate
Oura Da Da (Oura) Readiness și alte scoruri Oura rămân în aplicația Oura
Withings Da, prin Health Mate Da (Blog Android Developers) 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:

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

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.:

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

Reguli de urmat

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

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