Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
Дистанційний моніторинг пацієнтів з FHIR
Від домашніх показників артеріального тиску до сповіщень: спостереження пристроїв, підписані вебхуки, ідемпотентне правило та те, що залишається поза шаром даних. Перевірений код.
Віддалений моніторинг пацієнтів (RPM) збирає вимірювання, які пацієнт робить вдома — артеріальний тиск, вагу, рівень глюкози, насичення киснем — і дозволяє команді догляду бачити їх та реагувати на них між візитами. Частина даних складається з чотирьох кроків: отримати кожне вимірювання до запису пацієнта як кодоване спостереження, атрибутоване пристроєм; реагувати на надходження нового вимірювання; вирішити за допомогою чіткого правила, чи потребує воно уваги; і вести облік того, що зробила команда. Ця сторінка будує цей конвеєр на 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). Кожне зчитування манжети є спостереженням (Observation) з LOINC 85354-9 та двома компонентами (8480-6 систолічний, 8462-4 діастолічний), часом вимірювання та
author_type: device. На відміну від щоденних звітів носимих пристроїв, зчитування RPM є індивідуальними вимірюваннями, які клініцист може переглядати одне за одним. - Реагувати на події, а не на таймер. Вебхук для кожного нового спостереження (Observation) дозволяє правилу запускатися через кілька секунд після надходження зчитування.
- Правила для кількох зчитувань. Одне високе зчитування часто є шумом; більшість протоколів розглядають серію. Правило нижче запитує три послідовні зчитування на рівні 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] (клас [VR] для віддаленого контакту), коли команда телефонує пацієнту, та будь-яка зміна медикаментів як [MedicationStatement].
Anpheros зберігає ці ресурси; він не має власного ресурсу сповіщень або завдань (Flag, Task та Communication не входять до його типів ресурсів), тому черги сповіщень та маршрутизація чергових належать вашій службі.
Білінг, регулювання та безпека
Програми RPM часто залежать від правил відшкодування — у Сполучених Штатах Medicare оплачує дистанційний фізіологічний моніторинг за певними кодами CPT з мінімальною кількістю днів з даними та часом, витраченим командою догляду. Ці правила змінюються, і платформа даних не може їх сертифікувати; перевіряйте актуальні правила CMS та зберігайте докази (показники та час роботи команди) у власній системі. Програмне забезпечення, яке інтерпретує показники для діагностики або лікування, може регулюватися як медичний пристрій. Зберігайте порогові значення у розпорядженні клініцистів та реєструйте кожне сповіщення та відповідь.
Місце Anpheros
Anpheros надає записи (FHIR R4 Observations з походженням, CarePlan, Encounter), підписані вебхуки з повторними спробами, згоду, якщо додаток іншої організації потребує доступу до показників, та журнал доступу, який може переглядати пацієнт. Він не підключається до постачальників пристроїв, не визначає, що є аномальним, не надсилає сповіщення та не займається виставленням рахунків.
Часті запитання
Який ресурс FHIR зберігає показники артеріального тиску в домашніх умовах?
Observation з LOINC 85354-9 (панель артеріального тиску) та двома компонентами: 8480-6 (систолічний) та 8462-4 (діастолічний), кожен з яких є valueQuantity у mm[Hg], з часом вимірювання та пристроєм як автором.
Чи слід використовувати щоденні середні показники RPM чи окремі вимірювання?
Окремі вимірювання для клінічних показників, таких як артеріальний тиск, вага або глюкоза, оскільки клініцисти переглядають та враховують їх. Щоденні узагальнення підходять для високочастотних даних з носимих пристроїв, таких як частота серцевих скорочень або кроки.
Як запустити сповіщення, коли надходить нове вимірювання?
Підпишіться на resource.created вебхуки, перевірте підпис, отримайте нове Observation та оцініть своє правило за останніми даними. Доставки можуть повторюватися, тому дедуплікуйте за ідентифікатором події та зробіть сповіщення ідемпотентним.
Чи може Anpheros надсилати сповіщення клініцистам?
Ні. Він сповіщає вашу службу через вебхуки; хто отримує сповіщення, як і коли, вирішується у вашій системі.
Пов'язане
- Дані з носимих пристроїв у FHIR
- Віртуальна допомога та ШІ-лікарі: необхідні дані
- Вебхуки
- Пояснення походження медичних даних
- Інтеграції в галузі охорони здоров'я
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card