Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
Απομακρυσμένη παρακολούθηση ασθενών με FHIR
Από μετρήσεις πίεσης αίματος στο σπίτι έως ειδοποιήσεις: Παρατηρήσεις συσκευής, υπογεγραμμένα webhooks, κανόνας ιδεοδυναμίας και τι μένει εκτός του επιπέδου δεδομένων. Δοκιμασμένος κώδικας.
Η απομακρυσμένη παρακολούθηση ασθενών (RPM) συλλέγει μετρήσεις που λαμβάνει ένας ασθενής στο σπίτι — αρτηριακή πίεση, βάρος, γλυκόζη, κορεσμός οξυγόνου — και επιτρέπει σε μια ομάδα φροντίδας να τις βλέπει και να ενεργεί βάσει αυτών μεταξύ των επισκέψεων. Το κομμάτι των δεδομένων έχει τέσσερα βήματα: εισαγωγή κάθε μέτρησης στο αρχείο του ασθενούς ως κωδικοποιημένη Παρατήρηση (Observation) με απόδοση συσκευής· αντίδραση όταν φτάνει μια νέα μέτρηση· απόφαση με έναν σαφή κανόνα εάν χρειάζεται προσοχή· και διατήρηση αρχείου για το τι έκανε η ομάδα. Αυτή η σελίδα κατασκευάζει αυτή τη ροή με HL7 FHIR R4 με Anpheros webhooks και το 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 είναι μεμονωμένες μετρήσεις που ένας κλινικός ιατρός μπορεί να εξετάσει μία προς μία. - Αντίδραση σε συμβάντα, όχι σε χρονοδιακόπτη. Ένα webhook ανά νέα Παρατήρηση (Observation) επιτρέπει την εκτέλεση του κανόνα δευτερόλεπτα μετά την άφιξη της ανάγνωσης.
- Κανόνες για πολλές αναγνώσεις. Μία μεμονωμένη υψηλή ανάγνωση είναι συχνά θόρυβος. Τα περισσότερα πρωτόκολλα εξετάζουν μια σειρά. Ο παρακάτω κανόνας ζητά τρεις διαδοχικές αναγνώσεις στο ή πάνω από 140/90. Αυτό το όριο είναι ένα παράδειγμα, όχι κλινική συμβουλή: η ομάδα φροντίδας ορίζει τον κανόνα για κάθε ασθενή.
Εγγραφή μετρήσεων από τη συσκευή
Η εφαρμογή του τηλεφώνου (ή το cloud του προμηθευτή της συσκευής, μέσω του backend σας) γράφει κάθε μέτρηση:
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) αντί για ημερήσιους μέσους όρους.
Αντίδραση σε νέες μετρήσεις
Καταχωρήστε ένα webhook endpoint μία φορά (POST /v1/webhooks με events: ["resource.created"]). Η απόκριση περιέχει το signing secret. Στη συνέχεια, εκτελέστε μια μικρή υπηρεσία που επαληθεύει κάθε παράδοση και αξιολογεί τον κανόνα:
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 event ανά μέτρηση. Αυτά τα events, υπογεγραμμένα με τον δικό της κωδικό υπογραφής της πλατφόρμας, στάλθηκαν στην παραπάνω υπηρεσία μαζί με δύο διπλότυπα και ένα αίτημα υπογεγραμμένο με λάθος secret. Το αποτέλεσμα: η λάθος υπογραφή έλαβε 400, τα διπλότυπα αγνοήθηκαν, και η υπηρεσία σήμανε ακριβώς μία ειδοποίηση — 152/95, 149/94, 144/92 — όχι μία ανά event.
Στην παραγωγή, κρατήστε το seen και το alerted σε μια βάση δεδομένων αντί για τη μνήμη, ώστε μια επανεκκίνηση να μην επαναλαμβάνει ειδοποιήσεις.
Λήψη webhooks κατά την ανάπτυξη. Το Anpheros δέχεται και παραδίδει μόνο σε δημόσια HTTPS endpoints: μια localhost ή ιδιωτική διεύθυνση απορρίπτεται όταν την καταχωρείτε (400, πεδίο url), ακόμη και στο sandbox, και κάθε παράδοση ελέγχει ξανά τη διεύθυνση. Για να λαμβάνετε events στο laptop σας, εκθέστε την υπηρεσία μέσω ενός δημόσιου HTTPS tunnel και καταχωρήστε τη διεύθυνση του tunnel. Δείτε Webhooks.
Τι πρέπει να εμφανίζει η εγγραφή στη συνέχεια
Η ειδοποίηση από μόνη της βρίσκεται στην υπηρεσία παρακολούθησης, αλλά η εγγραφή πρέπει να δείχνει τι προέκυψε από αυτήν, ώστε ο επόμενος κλινικός ιατρός και ο ασθενής να βλέπουν ολόκληρη την ιστορία:
- τις μετρήσεις, καθεμία σημειωμένη ως δεδομένα συσκευής με το σύστημα προέλευσής της (provenance);
- ένα
CarePlanμε το σχέδιο παρακολούθησης (τι μετράται, πόσο συχνά, ο στόχος); - ένα
Encounter(κλάσηVRγια απομακρυσμένη επαφή) όταν η ομάδα καλεί τον ασθενή, και οποιαδήποτε αλλαγή φαρμακευτικής αγωγής ωςMedicationStatement.
Το Anpheros αποθηκεύει αυτούς τους πόρους· δεν διαθέτει δικό του πόρο ειδοποίησης ή εργασίας (οι Flag, Task και Communication δεν περιλαμβάνονται στους τύπους πόρων του), επομένως οι ουρές ειδοποιήσεων και η δρομολόγηση σε εφημερεύοντες ανήκουν στην υπηρεσία σας.
Χρεώσεις, κανονισμοί και ασφάλεια
Τα προγράμματα RPM συχνά εξαρτώνται από κανόνες αποζημίωσης — στις Ηνωμένες Πολιτείες, το Medicare πληρώνει για την απομακρυσμένη φυσιολογική παρακολούθηση υπό συγκεκριμένους κωδικούς CPT με ελάχιστο αριθμό ημερών με δεδομένα και χρόνο που δαπανά η ομάδα φροντίδας. Αυτοί οι κανόνες αλλάζουν και δεν είναι κάτι που μπορεί να πιστοποιήσει μια πλατφόρμα δεδομένων· ελέγξτε τους τρέχοντες κανόνες CMS και διατηρήστε τα αποδεικτικά στοιχεία (τις μετρήσεις και τον χρόνο της ομάδας) στο δικό σας σύστημα. Το λογισμικό που ερμηνεύει τις μετρήσεις για να οδηγήσει σε διάγνωση ή θεραπεία μπορεί να ρυθμίζεται ως ιατρική συσκευή. Διατηρήστε τα όρια στα χέρια των κλινικών και καταγράψτε κάθε ειδοποίηση και απόκριση.
Πού εντάσσεται το Anpheros
Το Anpheros παρέχει το αρχείο (FHIR R4 Observations με προέλευση, CarePlan, Encounter), υπογεγραμμένα webhooks με επαναδοκιμές, συναίνεση εάν η εφαρμογή ενός άλλου οργανισμού χρειάζεται να διαβάσει τις μετρήσεις, και ένα αρχείο καταγραφής πρόσβασης που μπορεί να δει ο ασθενής. Δεν συνδέεται με προμηθευτές συσκευών, δεν αποφασίζει τι είναι ανώμαλο, δεν στέλνει ειδοποιήσεις ούτε διαχειρίζεται τη χρέωση.
Συχνές ερωτήσεις
Ποιος πόρος FHIR αποθηκεύει μια μέτρηση αρτηριακής πίεσης στο σπίτι;
Μια παρατήρηση (Observation) με LOINC 85354-9 (panel αρτηριακής πίεσης) και δύο στοιχεία, 8480-6 (συστολική) και 8462-4 (διαστολική), καθένα valueQuantity σε mm[Hg], με τον χρόνο μέτρησης και τη συσκευή ως συγγραφέα.
Τα δεδομένα RPM πρέπει να είναι ημερήσιοι μέσοι όροι ή μεμονωμένες μετρήσεις;
Μεμονωμένες μετρήσεις για κλινικές μετρήσεις όπως αρτηριακή πίεση, βάρος ή γλυκόζη, επειδή οι κλινικοί γιατροί τις αναθεωρούν και τις μετρούν. Οι ημερήσιες περιλήψεις ταιριάζουν σε δεδομένα φορητών συσκευών υψηλής συχνότητας, όπως ο καρδιακός ρυθμός ή τα βήματα.
Πώς μπορώ να ενεργοποιήσω μια ειδοποίηση όταν φτάνει μια νέα μέτρηση;
Εγγραφείτε σε webhooks resource.created, επαληθεύστε την υπογραφή, ανακτήστε τη νέα παρατήρηση (Observation) και αξιολογήστε τον κανόνα σας πάνω στην πρόσφατη σειρά. Οι παραδόσεις μπορεί να επαναληφθούν, οπότε κάντε deduplication με βάση το αναγνωριστικό συμβάντος (event id) και κάντε την ειδοποίηση ιδεοδύναμη (idempotent).
Μπορεί το Anpheros να στείλει ειδοποιήσεις σε κλινικούς γιατρούς;
Όχι. Ειδοποιεί την υπηρεσία σας μέσω webhooks. ποιος ειδοποιείται, πώς και πότε αποφασίζεται στο σύστημά σας.
Σχετικά
- Δεδομένα φορητών συσκευών σε FHIR
- Εικονική φροντίδα και γιατροί AI: τα δεδομένα που χρειάζονται
- Webhooks
- Επεξήγηση προέλευσης ιατρικών δεδομένων
- Ενσωματώσεις υγειονομικής περίθαλψης
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card