Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
المراقبة عن بعد للمرضى بصيغة FHIR
من قراءات ضغط الدم المنزلية إلى التنبيهات: ملاحظات الأجهزة، خطافات الويب الموقعة، قاعدة غير متغيرة، وما يبقى خارج طبقة البيانات. كود مُختبر.
تجمع المراقبة عن بعد للمرضى (RPM) القياسات التي يأخذها المريض في المنزل — ضغط الدم، الوزن، الجلوكوز، تشبع الأكسجين — وتسمح لفريق الرعاية برؤيتها والتصرف بناءً عليها بين الزيارات. يتكون جزء البيانات من أربع خطوات: إدخال كل قراءة في سجل المريض كملاحظة (Observation) مرمزة ومُنسبة للجهاز؛ الاستجابة عند وصول قراءة جديدة؛ اتخاذ قرار بقاعدة واضحة حول ما إذا كانت تتطلب اهتمامًا؛ والاحتفاظ بسجل لما فعله الفريق. تبني هذه الصفحة خط الأنابيب هذا على HL7 FHIR R4 باستخدام خطافات الويب Anpheros و TypeScript SDK، مع كود تم تشغيله مقابل المنصة، وتسرد ما يبقى خارج طبقة البيانات.
خط الأنابيب
cuff, scale, glucose meter, pulse oximeter
│ (Bluetooth / vendor app / Apple Health / Health Connect)
▼
patient's phone app ──► your backend ──► FHIR Observation (author: device) in the patient's record
│ webhook: resource.created (signed)
▼
your monitoring service: rule → alert → care team
│
note, call, CarePlan change, next appointment
ثلاثة خيارات تقرر ما إذا كان هذا يعمل عمليًا:
- قراءة واحدة، ملاحظة واحدة. كل قراءة للكفة هي ملاحظة (Observation) مع LOINC 85354-9 ومكونين (8480-6 انقباضي، 8462-4 انبساطي)، وقت القياس، و
author_type: device. على عكس ملخصات الأجهزة القابلة للارتداء اليومية، فإن قراءات RPM هي قياسات فردية قد ينظر إليها الطبيب واحدة تلو الأخرى. - التفاعل مع الأحداث، وليس مع مؤقت. تسمح خطافات الويب (webhook) لكل ملاحظة جديدة بتشغيل القاعدة بعد ثوانٍ من وصول القراءة.
- قواعد عبر عدة قراءات. غالبًا ما تكون القراءة العالية الواحدة ضوضاء؛ معظم البروتوكولات تنظر إلى سلسلة. تطلب القاعدة أدناه ثلاث قراءات متتالية عند أو فوق 140/90. هذا الحد هو مثال، وليس نصيحة سريرية: يحدد فريق الرعاية القاعدة لكل مريض.
كتابة القراءات من الجهاز
يقوم تطبيق الهاتف (أو سحابة بائع الجهاز، عبر الواجهة الخلفية الخاصة بك) بكتابة كل قراءة:
await anpheros.observations.create(patientId, {
code: '85354-9', category: 'vital-signs', effective_at: '2026-10-13T07:15:00-04:00', author_type: 'device',
components: [{ code: '8480-6', value: 152, unit: 'mm[Hg]' }, { code: '8462-4', value: 95, unit: 'mm[Hg]' }],
}, { source_system: 'bp-cuff-app' });
إذا كانت القراءات تأتي عبر Apple Health أو Health Connect بدلاً من الجهاز مباشرة، فاقرأها على الهاتف كما هو موضح في بيانات الأجهزة القابلة للارتداء في FHIR، ولكن احتفظ بقراءات ضغط الدم الفردية كـ Observations فردية بدلاً من متوسطات يومية.
الاستجابة للقراءات الجديدة
قم بتسجيل نقطة نهاية خطاف الويب مرة واحدة (POST /v1/webhooks مع events: ["resource.created"])؛ يحتوي الرد على سر التوقيع. ثم قم بتشغيل خدمة صغيرة تتحقق من كل تسليم وتقيّم القاعدة:
import { createServer } from 'node:http';
import { Anpheros, apiKey, verifyWebhookSignature } from '@anpheros/sdk';
const anpheros = new Anpheros({ auth: apiKey(process.env.ANPHEROS_KEY!) });
const SECRET = process.env.WEBHOOK_SECRET!;
const seen = new Set<string>(); // deliveries are at-least-once: de-duplicate by event id
const alerted = new Set<string>(); // one alert per newest reading, however many events arrive
// Rule: the three most recent home readings all at or above 140/90 → tell the care team once
async function checkBloodPressure(patientId: string, observationId: string) {
const obs = await anpheros.observations.get(observationId);
if (obs.code !== '85354-9') return; // only blood pressure readings trigger the rule
const { data } = await anpheros.observations.list(patientId, { code: '85354-9', limit: 3 }); // newest first
const value = (o: typeof obs, code: string) => o.components.find(c => c.code === code)?.value ?? 0;
const allHigh = data.length === 3 && data.every(o => value(o, '8480-6') >= 140 || value(o, '8462-4') >= 90);
if (!allHigh || alerted.has(data[0].id)) return;
alerted.add(data[0].id);
console.log(`ALERT patient ${patientId}: last 3 readings ≥ 140/90 →`,
data.map(o => `${value(o, '8480-6')}/${value(o, '8462-4')}`).join(', ')); // in production: notify the care team
}
createServer(async (req, res) => {
const chunks: Buffer[] = [];
for await (const c of req) chunks.push(c as Buffer);
const body = Buffer.concat(chunks).toString('utf8');
const ok = await verifyWebhookSignature({ secret: SECRET, header: req.headers['anpheros-signature'] as string, body });
if (!ok) { res.writeHead(400).end(); return; } // not from Anpheros, or too old
res.writeHead(204).end(); // answer fast; do the work after
const event = JSON.parse(body);
if (seen.has(event.id)) return;
seen.add(event.id);
const d = event.data;
if (event.type === 'resource.created' && d.resource_type === 'Observation') await checkBloodPressure(d.patient, d.id);
}).listen(8799);
كيف اختبرناها: تمت كتابة أربع قراءات صباحية (136/86، 144/92، 149/94، 152/95) لمريض اصطناعي على نسخة محلية من المنصة، وأنتجت المنصة حدث resource.created موقعًا واحدًا لكل قراءة. تم إرسال تلك الأحداث، الموقعة برمز توقيع المنصة الخاص، إلى الخدمة المذكورة أعلاه مع نسختين مكررتين وطلب واحد موقع بسِرّ خاطئ. النتيجة: حصل التوقيع الخاطئ على 400، وتم تجاهل النسخ المكررة، وأصدرت الخدمة تنبيهًا واحدًا بالضبط - 152/95, 149/94, 144/92 - وليس تنبيهًا واحدًا لكل حدث.
في بيئة الإنتاج، احتفظ بـ seen و alerted في قاعدة بيانات بدلاً من الذاكرة، حتى لا تتكرر التنبيهات عند إعادة التشغيل.
استلام خطافات الويب أثناء التطوير. تقبل Anpheros وتُسلّم فقط إلى نقاط نهاية HTTPS عامة: يتم رفض عنوان localhost أو عنوان خاص عند تسجيله (400، الحقل url)، حتى في بيئة الاختبار، ويتحقق كل تسليم من العنوان مرة أخرى. لاستلام الأحداث على جهاز الكمبيوتر المحمول الخاص بك، قم بتعريض الخدمة عبر نفق HTTPS عام وسجل عنوان النفق. انظر خطافات الويب.
ما يجب أن يظهره السجل بعد ذلك
يعيش التنبيه نفسه في خدمة المراقبة الخاصة بك، ولكن يجب أن يوضح السجل ما نتج عنه، حتى يرى الطبيب التالي والمريض القصة الكاملة:
- القراءات، كل منها مُعلمة كبيانات جهاز مع نظام مصدرها (provenance);
CarePlanمع خطة المراقبة (ما يتم قياسه، وكم مرة، والهدف);Encounter(classVRللاتصال عن بعد) عندما يتصل الفريق بالمريض، وأي تغيير في الدواء كـMedicationStatement.
يقوم Anpheros بتخزين هذه الموارد؛ لا يمتلك مورد تنبيه أو مهمة خاص به (Flag، Task، و Communication ليست من بين أنواع موارده)، لذا فإن قوائم انتظار التنبيهات والتوجيه عند الطلب تنتمي إلى خدمتك.
الفوترة والتنظيم والسلامة
غالباً ما تعتمد برامج المراقبة عن بعد (RPM) على قواعد السداد — في الولايات المتحدة، تدفع Medicare مقابل المراقبة الفسيولوجية عن بعد بموجب رموز CPT محددة مع الحد الأدنى لعدد الأيام التي تحتوي على بيانات والوقت الذي يقضيه فريق الرعاية. تتغير هذه القواعد وليست شيئاً يمكن لمنصة البيانات اعتماده؛ تحقق من قواعد CMS الحالية واحتفظ بالأدلة (القراءات ووقت الفريق) في نظامك الخاص. قد يخضع البرنامج الذي يفسر القراءات لتوجيه التشخيص أو العلاج للتنظيم كجهاز طبي. احتفظ بالحدود في أيدي الأطباء وسجل كل تنبيه واستجابة.
أين يتناسب Anpheros
يوفر Anpheros السجل (ملاحظات FHIR R4 مع المصدر، خطة الرعاية، اللقاء)، خطافات الويب الموقعة مع إعادة المحاولة، الموافقة إذا احتاج تطبيق منظمة أخرى لقراءة القراءات، وسجل وصول يمكن للمريض رؤيته. لا يتصل بموردي الأجهزة، ولا يقرر ما هو غير طبيعي، ولا يرسل تنبيهات، ولا يتعامل مع الفوترة.
أسئلة متكررة
أي مورد FHIR يخزن قراءة ضغط الدم المنزلية؟
ملاحظة (Observation) مع LOINC 85354-9 (لوحة ضغط الدم) ومكونين، 8480-6 (الانقباضي) و 8462-4 (الانبساطي)، كل منهما valueQuantity في mm[Hg]، مع وقت القياس والجهاز كالمؤلف.
هل يجب أن تكون بيانات RPM متوسطات يومية أم قراءات فردية؟
قراءات فردية للقياسات السريرية مثل ضغط الدم أو الوزن أو الجلوكوز، لأن الأطباء يراجعونها ويعدونها. الملخصات اليومية تناسب بيانات الأجهزة القابلة للارتداء عالية التردد مثل معدل ضربات القلب أو الخطوات.
كيف أقوم بتشغيل تنبيه عند وصول قراءة جديدة؟
اشترك في خطافات الويب (webhooks) resource.created، تحقق من التوقيع، جلب الملاحظة الجديدة (Observation) وقيّم قاعدتك على السلسلة الأخيرة. يمكن أن تتكرر عمليات التسليم، لذا قم بإزالة التكرار حسب معرف الحدث (event id) واجعل التنبيه متطابقًا (idempotent).
هل يمكن لـ Anpheros إرسال تنبيهات إلى الأطباء؟
لا. يقوم بإخطار خدمتك عبر خطافات الويب (webhooks)؛ من يتم تنبيهه، وكيف، ومتى يتم اتخاذه في نظامك.
ذات الصلة
- بيانات الأجهزة القابلة للارتداء في FHIR
- الرعاية الافتراضية والأطباء المدعومون بالذكاء الاصطناعي: البيانات التي يحتاجونها
- خطافات الويب (Webhooks)
- شرح مصدر بيانات الرعاية الصحية (Medical data provenance)
- تكاملات الرعاية الصحية
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card