Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
Monitorizare la distanță a pacienților cu FHIR
De la măsurători de tensiune arterială la domiciliu la alerte: Observații ale dispozitivelor, webhooks semnate, o regulă idempotentă și ce rămâne în afara stratului de date. Cod testat.
Monitorizarea pacienților de la distanță (RPM) colectează măsurători pe care un pacient le face acasă — tensiune arterială, greutate, glucoză, saturație de oxigen — și permite unei echipe de îngrijire să le vizualizeze și să acționeze asupra lor între vizite. Partea de date are patru pași: introducerea fiecărei măsurători în fișa pacientului ca o Observație codificată, atribuită dispozitivului; reacționarea la sosirea unei noi măsurători; decizia cu o regulă clară dacă aceasta necesită atenție; și păstrarea unei evidențe a ceea ce a făcut echipa. Această pagină construiește acest flux pe HL7 FHIR R4 cu webhooks Anpheros și SDK-ul TypeScript, cu cod care a fost rulat pe platformă, și listează ce rămâne în afara stratului de date.
Pipeline-ul
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
Trei alegeri decid dacă acest lucru funcționează în practică:
- O citire, o observație. Fiecare citire a manșetei este o Observație cu LOINC 85354-9 și două componente (8480-6 sistolic, 8462-4 diastolic), ora măsurării și
author_type: device. Spre deosebire de rezumatele zilnice ale dispozitivelor purtabile, citirile RPM sunt măsurători individuale pe care un clinician le poate examina una câte una. - Reacționează la evenimente, nu la un cronometru. Un webhook pentru fiecare Observație nouă permite regulii să ruleze la câteva secunde după sosirea citirii.
- Reguli peste mai multe citiri. O singură citire ridicată este adesea zgomot; majoritatea protocoalelor examinează o serie. Regula de mai jos solicită trei citiri consecutive la sau peste 140/90. Acest prag este un exemplu, nu un sfat clinic: echipa de îngrijire stabilește regula pentru fiecare pacient.
Scrierea citirilor de la dispozitiv
Aplicația de telefon (sau cloud-ul furnizorului de dispozitive, prin intermediul backend-ului dvs.) scrie fiecare citire:
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' });
Dacă citirile provin prin Apple Health sau Health Connect, mai degrabă decât direct de la dispozitiv, citiți-le pe telefon așa cum este descris în Date purtabile în FHIR, dar păstrați citirile individuale de tensiune arterială ca Observații individuale în loc de medii zilnice.
Reacția la noi măsurători
Înregistrați un punct final webhook o singură dată (POST /v1/webhooks cu events: ["resource.created"]); răspunsul conține secretul de semnare. Apoi, rulați un mic serviciu care verifică fiecare livrare și evaluează regula:
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);
Cum am testat: patru măsurători matinale (136/86, 144/92, 149/94, 152/95) au fost scrise unui pacient sintetic pe o instanță locală a platformei, iar platforma a generat un eveniment resource.created semnat per măsurătoare. Acele evenimente, semnate cu propriul cod de semnare al platformei, au fost trimise serviciului de mai sus împreună cu două duplicate și o cerere semnată cu un secret greșit. Rezultatul: semnătura greșită a primit 400, duplicatele au fost ignorate, iar serviciul a generat exact o alertă — 152/95, 149/94, 144/92 — nu una per eveniment.
În producție, păstrați seen și alerted într-o bază de date, nu în memorie, astfel încât o repornire să nu repete alertele.
Primirea webhook-urilor în timpul dezvoltării. Anpheros acceptă și livrează doar către puncte finale HTTPS publice: o adresă localhost sau privată este refuzată atunci când o înregistrați (400, câmpul url), chiar și în sandbox, iar fiecare livrare verifică din nou adresa. Pentru a primi evenimente pe laptopul dvs., expuneți serviciul printr-un tunel HTTPS public și înregistrați adresa tunelului. Vezi Webhooks.
Ce ar trebui să arate înregistrarea ulterior
Alerta în sine se află în serviciul dvs. de monitorizare, dar înregistrarea ar trebui să arate ce a rezultat din ea, astfel încât următorul clinician și pacientul să vadă întreaga poveste:
- citirile, fiecare marcată ca date de la dispozitiv cu sistemul său sursă (proveniență);
- un
CarePlancu planul de monitorizare (ce se măsoară, cât de des, obiectivul); - un
Encounter(clasaVRpentru un contact la distanță) atunci când echipa sună pacientul, și orice modificare a medicației ca unMedicationStatement.
Anpheros stochează aceste resurse; nu are o resursă proprie de alertare sau de sarcini (Flag, Task și Communication nu se numără printre tipurile sale de resurse), astfel încât cozile de alerte și rutarea la apel aparțin serviciului dvs.
Facturare, reglementare și siguranță
Programele RPM depind adesea de regulile de rambursare — în Statele Unite, Medicare plătește pentru monitorizarea fiziologică la distanță sub coduri CPT specifice, cu un număr minim de zile cu date și timp petrecut de echipa de îngrijire. Aceste reguli se schimbă și nu sunt ceva ce o platformă de date poate certifica; verificați regulile CMS actuale și păstrați dovezile (citirile și timpul echipei) în propriul sistem. Software-ul care interpretează citirile pentru a conduce diagnosticul sau tratamentul poate fi reglementat ca dispozitiv medical. Păstrați pragurile la îndemâna clinicienilor și înregistrați fiecare alertă și răspuns.
Unde se încadrează Anpheros
Anpheros oferă înregistrarea (FHIR R4 Observations cu proveniență, CarePlan, Encounter), webhook-uri semnate cu reîncercări, consimțământ dacă aplicația altei organizații are nevoie să citească valorile, și un jurnal de acces pe care pacientul îl poate vizualiza. Nu se conectează la furnizorii de dispozitive, nu decide ce este anormal, nu trimite alerte și nu gestionează facturarea.
Întrebări frecvente
Ce resursă FHIR stochează o citire a tensiunii arteriale la domiciliu?
O Observation cu LOINC 85354-9 (panel tensiune arterială) și două componente, 8480-6 (sistolic) și 8462-4 (diastolic), fiecare o valueQuantity în mm[Hg], cu timpul măsurării și dispozitivul ca autor.
Datele RPM ar trebui să fie medii zilnice sau citiri individuale?
Citiri individuale pentru măsurători clinice precum tensiunea arterială, greutatea sau glucoza, deoarece clinicienii le revizuiesc și le numără. Rezumatele zilnice sunt potrivite pentru date de la dispozitive purtabile de înaltă frecvență, cum ar fi ritmul cardiac sau pașii.
Cum declanșez o alertă când sosește o citire nouă?
Abonează-te la webhooks resource.created, verifică semnătura, preia noua Observation și evaluează regula ta peste seria recentă. Livrările se pot repeta, așa că deduplifică după ID-ul evenimentului și fă alerta idempotentă.
Poate Anpheros să trimită alerte clinicienilor?
Nu. Acesta notifică serviciul tău prin webhooks; cine este alertat, cum și când se decide în sistemul tău.
Conexe
- Date de la dispozitive purtabile în FHIR
- Îngrijire virtuală și medici AI: datele de care au nevoie
- Webhooks
- Proveniența datelor medicale explicată
- Integrări în domeniul sănătății
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card