Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
Remote Patient Monitoring mit FHIR
Von Blutdruckwerten zu Hause bis zu Alarmen: Geräte-Observations, signierte Webhooks, eine idempotente Regel und was außerhalb der Datenebene bleibt. Getesteter Code.
Remote Patient Monitoring (RPM) sammelt Messungen, die ein Patient zu Hause durchführt – Blutdruck, Gewicht, Glukose, Sauerstoffsättigung – und ermöglicht es einem Pflegeteam, diese zwischen den Besuchen einzusehen und darauf zu reagieren. Der Datenteil umfasst vier Schritte: jede Messung als kodierte, gerätebezogene Observation in die Patientenakte aufnehmen; reagieren, wenn eine neue Messung eintrifft; mit einer klaren Regel entscheiden, ob sie Aufmerksamkeit erfordert; und eine Aufzeichnung darüber führen, was das Team unternommen hat. Diese Seite baut diese Pipeline auf HL7 FHIR R4 mit Anpheros Webhooks und dem TypeScript SDK auf, mit Code, der gegen die Plattform ausgeführt wurde, und listet auf, was außerhalb der Datenebene bleibt.
Die Pipeline
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
Drei Entscheidungen bestimmen, ob dies in der Praxis funktioniert:
- Eine Messung, eine Observation. Jede Manschettenmessung ist eine Observation mit LOINC 85354-9 und zwei Komponenten (8480-6 systolisch, 8462-4 diastolisch), der Messzeit und
author_type: device. Im Gegensatz zu täglichen Wearable-Zusammenfassungen sind RPM-Messungen einzelne Messungen, die ein Kliniker einzeln betrachten kann. - Auf Ereignisse reagieren, nicht auf einen Timer. Ein Webhook pro neuer Observation lässt die Regel Sekunden nach Eintreffen der Messung ausführen.
- Regeln über mehrere Messungen hinweg. Eine einzelne hohe Messung ist oft Rauschen; die meisten Protokolle betrachten eine Serie. Die folgende Regel fragt nach drei aufeinanderfolgenden Messungen bei oder über 140/90. Dieser Schwellenwert ist ein Beispiel, keine klinische Beratung: Das Pflegeteam legt die Regel für jeden Patienten fest.
Schreiben von Messwerten vom Gerät
Die Telefon-App (oder die Cloud des Geräteherstellers über Ihr Backend) schreibt jeden Messwert:
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' });
Wenn Messwerte über Apple Health oder Health Connect statt direkt vom Gerät kommen, lesen Sie diese auf dem Telefon wie in Wearable-Daten in FHIR beschrieben, aber behalten Sie einzelne Blutdruckmesswerte als einzelne Observations anstelle von Tagesdurchschnitten bei.
Reagieren auf neue Messwerte
Registrieren Sie einen Webhook-Endpunkt einmal (POST /v1/webhooks mit events: ["resource.created"]); die Antwort enthält das Signing Secret. Führen Sie dann einen kleinen Dienst aus, der jede Zustellung verifiziert und die Regel auswertet:
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);
Wie wir getestet haben: Vier morgendliche Messwerte (136/86, 144/92, 149/94, 152/95) wurden in einen synthetischen Patienten auf einer lokalen Instanz der Plattform geschrieben, und die Plattform erzeugte pro Messwert ein signiertes resource.created-Ereignis. Diese Ereignisse, signiert mit dem eigenen Signaturcode der Plattform, wurden zusammen mit zwei Duplikaten und einer mit einem falschen Secret signierten Anfrage an den obigen Dienst gesendet. Das Ergebnis: Die falsche Signatur erhielt 400, die Duplikate wurden ignoriert, und der Dienst löste genau einen Alarm aus – 152/95, 149/94, 144/92 – nicht einen pro Ereignis.
In der Produktion sollten Sie seen und alerted in einer Datenbank und nicht im Speicher halten, damit ein Neustart keine wiederholten Alarme auslöst.
Webhooks während der Entwicklung empfangen. Anpheros akzeptiert und liefert nur an öffentliche HTTPS-Endpunkte: eine localhost oder private Adresse wird bei der Registrierung abgelehnt (400, Feld url), auch im Sandbox-Modus, und jede Zustellung prüft die Adresse erneut. Um Ereignisse auf Ihrem Laptop zu empfangen, machen Sie den Dienst über einen öffentlichen HTTPS-Tunnel zugänglich und registrieren Sie die Adresse des Tunnels. Siehe Webhooks.
Was der Datensatz danach anzeigen sollte
Der Alarm selbst verbleibt in Ihrem Überwachungsdienst, aber der Datensatz sollte zeigen, was daraus resultiert, damit der nächste Kliniker und der Patient die vollständige Geschichte sehen:
- die Messwerte, jeweils als Gerätedaten mit ihrem Quellsystem gekennzeichnet (provenance);
- ein
CarePlanmit dem Überwachungsplan (was gemessen wird, wie oft, das Ziel); - ein
Encounter(KlasseVRfür einen Fernkontakt), wenn das Team den Patienten anruft, und jede Medikamentenänderung alsMedicationStatement.
Anpheros speichert diese Ressourcen; es verfügt über keine eigenen Alarm- oder Aufgabenressourcen (Flag, Task und Communication gehören nicht zu seinen Ressourcentypen), sodass Alarmwarteschlangen und On-Call-Routing zu Ihrem Dienst gehören.
Abrechnung, Regulierung und Sicherheit
RPM-Programme sind oft von Erstattungsregeln abhängig – in den Vereinigten Staaten bezahlt Medicare die Fernüberwachung physiologischer Daten unter bestimmten CPT-Codes mit einer Mindestanzahl von Tagen mit Daten und der vom Pflegeteam aufgewendeten Zeit. Diese Regeln ändern sich und sind nichts, was eine Datenplattform zertifizieren kann; überprüfen Sie die aktuellen CMS-Regeln und bewahren Sie die Nachweise (die Messwerte und die Zeit des Teams) in Ihrem eigenen System auf. Software, die Messwerte zur Diagnose oder Behandlung interpretiert, kann als Medizinprodukt reguliert sein. Halten Sie Schwellenwerte in den Händen von Klinikern und protokollieren Sie jede Benachrichtigung und Reaktion.
Wo Anpheros passt
Anpheros stellt den Datensatz (FHIR R4 Observations mit Provenienz, CarePlan, Encounter), signierte Webhooks mit Wiederholungsversuchen, die Zustimmung, falls die App einer anderen Organisation die Messwerte lesen muss, und ein Zugriffsprotokoll bereit, das der Patient einsehen kann. Es verbindet sich nicht mit Geräteherstellern, entscheidet, was abnormal ist, sendet Benachrichtigungen oder kümmert sich um die Abrechnung.
Häufig gestellte Fragen
Welche FHIR-Ressource speichert einen Blutdruckwert für zu Hause?
Eine Observation mit LOINC 85354-9 (Blutdruck-Panel) und zwei Komponenten, 8480-6 (systolisch) und 8462-4 (diastolisch), jeweils ein valueQuantity in mm[Hg], mit der Messzeit und dem Gerät als Autor.
Sollten RPM-Daten tägliche Durchschnittswerte oder einzelne Messwerte sein?
Einzelne Messwerte für klinische Messungen wie Blutdruck, Gewicht oder Glukose, da Kliniker diese überprüfen und zählen. Tägliche Zusammenfassungen eignen sich für hochfrequente Wearable-Daten wie Herzfrequenz oder Schritte.
Wie löse ich einen Alarm aus, wenn ein neuer Messwert eintrifft?
Abonnieren Sie resource.created Webhooks, verifizieren Sie die Signatur, rufen Sie die neue Observation ab und werten Sie Ihre Regel über die aktuelle Serie aus. Lieferungen können sich wiederholen, daher deduplizieren Sie nach Ereignis-ID und machen Sie den Alarm idempotent.
Kann Anpheros Alarme an Kliniker senden?
Nein. Es benachrichtigt Ihren Dienst über Webhooks; wer, wie und wann alarmiert wird, wird in Ihrem System entschieden.
Verwandte Themen
- Wearable-Daten in FHIR
- Virtuelle Pflege und KI-Ärzte: die benötigten Daten
- Webhooks
- Herkunft von medizinischen Daten erklärt
- Integrationen im Gesundheitswesen
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card