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، ملخصات يومية، وتحديث مُختبر.

للحصول على بيانات من ساعة ذكية أو خاتم أو ميزان ذكي في سجل طبي، اقرأها على الهاتف من مخزن الصحة الخاص بنظام التشغيل — 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 واجهة برمجة تطبيقات للخادم: لا يمكن قراءة البيانات إلا بواسطة تطبيق على هاتف الشخص. يقرأ تطبيقك البيانات، ويرسل قيمًا يومية موجزة إلى الواجهة الخلفية الخاصة بك، وتقوم الواجهة الخلفية بكتابتها في السجل.

الأجهزة التي تصل إلى أي مخزن صحي

ما يشاركه كل بائع يتغير مع إصدارات التطبيق؛ وثائق البائع الخاصة هي المرجع.

الجهاز أو التطبيق 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

الأكواد التي يستخدمها Anpheros Daily عند كتابة بيانات الأجهزة القابلة للارتداء إلى سجل FHIR:

المقياس Apple HealthKit Health Connect LOINC وحدة UCUM الفئة
معدل ضربات القلب 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، فإن قيمتين يوميتين متبوعتين بمزامنة لاحقة لخطوات نفس اليوم تركت ملاحظتين (Observations)، الملاحظة الخاصة بالخطوات في الإصدار 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 (لا يوجد واجهة برمجة تطبيقات للخادم)، ولخصها يوميًا، واجعل الواجهة الخلفية الخاصة بك تكتب كل مقياس كملاحظة (Observation) مع رمز LOINC ووحدة UCUM، مع وضع علامة عليها كبيانات جهاز.

هل توجد واجهة برمجة تطبيقات سحابية لـ Health Connect أو Apple Health؟

لا. كلاهما يحتفظ بالبيانات على الهاتف؛ يقرأها تطبيق مثبت على الهاتف بإذن الشخص. تمتلك سحابات الموردين مثل Garmin أو Fitbit أو Oura واجهات برمجة تطبيقات خاصة بها، ولكن قراءة مخزن صحة الهاتف تغطي معظمها بتكامل واحد.

ما هو رمز 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