# Távoli betegmegfigyelés FHIR használatával

> Otthoni vérnyomásmérésektől a riasztásokig: eszköz megfigyelések, aláírt webhookok, egy idempotens szabály, és ami az adatrétegen kívül marad. Tesztelt kód.

Source: https://developers.anpheros.com/hu/guides/remote-patient-monitoring-fhir

**A távoli betegmegfigyelés (RPM) olyan méréseket gyűjt, amelyeket a beteg otthon végez – vérnyomás, súly, glükóz, oxigéntelítettség –, és lehetővé teszi az ápolócsapat számára, hogy a látogatások között lássa és reagáljon rájuk.** Az adatfeldolgozás négy lépésből áll: minden mérést kódolt, eszközhöz rendelt Observationként rögzíteni a beteg rekordjában; reagálni, amikor új mérés érkezik; egyértelmű szabály alapján eldönteni, hogy figyelmet igényel-e; és nyilvántartást vezetni arról, mit tett a csapat. Ez az oldal ezt a folyamatot építi fel HL7 FHIR R4 használatával Anpheros webhookokkal és a TypeScript SDK-val, a platform ellen futtatott kóddal, és felsorolja, mi marad az adatrétegen kívül.

## A folyamat

```
 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
```

Három döntés határozza meg, hogy ez a gyakorlatban működik-e:

- **Egy leolvasás, egy megfigyelés (Observation).** Minden mandzsetta leolvasás egy Observation, amelyhez a LOINC 85354-9 kód tartozik, és két komponense van (8480-6 szisztolés, 8462-4 diasztolés), a mérés időpontja és `author_type: device`. A napi viselhető eszközök összefoglalóival ellentétben az RPM leolvasások egyedi mérések, amelyeket egy orvos egyesével is megtekinthet.
- **Reagálás eseményekre, nem időzítőre.** Az új Observation-ökhöz tartozó webhook lehetővé teszi a szabály futtatását másodpercekkel azután, hogy a leolvasás megérkezett.
- **Szabályok több leolvasásra.** Egyetlen magas leolvasás gyakran zaj; a legtöbb protokoll egy sorozatot vizsgál. Az alábbi szabály három egymást követő, 140/90 vagy annál magasabb leolvasást kér. Ez a küszöbérték példa, nem klinikai tanács: az egészségügyi csapat állítja be a szabályt minden beteg számára.

## Adatok írása az eszközről

A telefonos alkalmazás (vagy az eszköz gyártójának felhője a backend-en keresztül) minden egyes leolvasást a következőképpen ír:

```ts
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' });
```

Ha a leolvasások az Apple Health vagy a Health Connect platformon keresztül érkeznek, nem pedig közvetlenül az eszközről, akkor azokat a telefonon kell elolvasni, ahogy az a [Wearable data in FHIR](https://developers.anpheros.com/hu/guides/wearable-data-fhir) részben le van írva, de az egyes vérnyomás-leolvasásokat egyedi megfigyelésekként (Observations) kell tárolni a napi átlagok helyett.

## Új leolvasásokra való reagálás

Regisztráljon egy webhook végpontot egyszer (`POST /v1/webhooks` a `events: ["resource.created"]` segítségével); a válasz tartalmazza az aláíró titkot. Ezután futtasson egy kis szolgáltatást, amely ellenőrzi minden kézbesítést és kiértékeli a szabályt:

```ts
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);
```

Hogyan teszteltük: négy reggeli leolvasást (136/86, 144/92, 149/94, 152/95) írtunk egy szintetikus pácienshez a platform helyi példányán, és a platform minden leolvasáshoz egy aláírt `resource.created` eseményt generált. Ezeket az eseményeket, a platform saját aláíró kódjával aláírva, a fenti szolgáltatásnak küldtük el, két duplikátummal és egy helytelen titokkal aláírt kéréssel együtt. Az eredmény: a helytelen aláírás `400` lett, a duplikátumokat figyelmen kívül hagytuk, és a szolgáltatás pontosan egy riasztást emelt – `152/95, 149/94, 144/92` – nem eseményenként egyet.

Éles környezetben tartsa a `seen` és a `alerted` elemeket egy adatbázisban a memóriában tárolás helyett, így egy újraindítás nem ismétli meg a riasztásokat.

**Webhookok fogadása fejlesztés közben.** Az Anpheros csak nyilvános HTTPS végpontokat fogad el és kézbesít: egy `localhost` vagy privát címet elutasít a regisztrációkor (`400`, `url` mező), a sandboxban is, és minden kézbesítés újra ellenőrzi a címet. Az események laptopon történő fogadásához tegye elérhetővé a szolgáltatást egy nyilvános HTTPS alagúton keresztül, és regisztrálja az alagút címét. Lásd: [Webhooks](https://developers.anpheros.com/hu/guides/webhooks).

## Mit kell mutatnia az utólagos rekordnak

Maga az értesítés a monitorozó szolgáltatásban él, de a rekordnak meg kell mutatnia, mi lett az eredménye, így a következő klinikus és a beteg is látja a teljes történetet:

- a leolvasások, mindegyik eszközadatként jelölve a forrásrendszerével ([provenance](https://developers.anpheros.com/hu/guides/medical-data-provenance));
- egy `CarePlan` a monitorozási tervvel (mit mérnek, milyen gyakran, a cél);
- egy `Encounter` (egy távoli kapcsolattartás esetén `VR` osztály) amikor a csapat felhívja a beteget, és bármilyen gyógyszerváltozás mint `MedicationStatement`.

Az Anpheros tárolja ezeket az erőforrásokat; nincs saját riasztási vagy feladat erőforrása (a `Flag`, `Task` és `Communication` nem tartoznak az erőforrás típusai közé), így a riasztási sorok és az ügyeletes útvonalak a szolgáltatásához tartoznak.

## Számlázás, szabályozás és biztonság

Az RPM programok gyakran az újraszámlázási szabályoktól függenek — az Egyesült Államokban a Medicare fizet a távoli fiziológiai monitorozásért bizonyos CPT kódok alatt, minimális adatnapokkal és az egészségügyi csapat által eltöltött idővel. Ezek a szabályok változnak, és nem olyasmik, amiket egy adatplatform tanúsíthat; ellenőrizze az aktuális CMS szabályokat, és tartsa meg a bizonyítékokat (az olvasmányokat és a csapat idejét) a saját rendszerében. Az olvasmányokat diagnózis vagy kezelés vezérlésére értelmező szoftver orvostechnikai eszközként szabályozható lehet. Tartsa a küszöbértékeket a klinikusok kezében, és naplózzon minden riasztást és választ.

## Hol illeszkedik be az Anpheros

Az Anpheros biztosítja a rekordot (FHIR R4 megfigyelések származási információval, CarePlan, Encounter), aláírt webhookokat újraküldéssel, hozzájárulást, ha egy másik szervezet alkalmazásának szüksége van az olvasmányok olvasására, valamint egy hozzáférési naplót, amelyet a beteg láthat. Nem csatlakozik az eszközgyártókhoz, nem dönt arról, mi a rendellenes, nem küld riasztásokat, és nem kezeli a számlázást.

## Gyakran ismételt kérdések

### Melyik FHIR erőforrás tárolja az otthoni vérnyomásmérést?
Egy Observation erőforrás a `valueQuantity` LOINC kóddal (vérnyomás panel) és két komponenssel: 8480-6 (szisztolés) és 8462-4 (diasztolés), mindkettő `mm[Hg]`, a mérés idejével és a készülékkel mint szerzővel.

### A RPM adatok napi átlagok vagy egyedi mérések legyenek?
Egyedi mérések a klinikai mérésekhez, mint például vérnyomás, súly vagy glükóz, mert a klinikusok áttekintik és számolják őket. A napi összefoglalók megfelelnek a nagy frekvenciájú viselhető eszközökből származó adatoknak, mint például a pulzusszám vagy a lépésszám.

### Hogyan indíthatok el egy riasztást, amikor új mérés érkezik?
Iratkozzon fel a `resource.created` webhookokra, ellenőrizze az aláírást, lekérdezi az új Observationt, és értékelje ki a szabályát a legutóbbi sorozaton. A kézbesítések ismétlődhetnek, ezért duplikációmentesítse az eseményazonosító alapján, és tegye az értesítést idempotenssé.

### Tud az Anpheros riasztásokat küldeni a klinikusoknak?
Nem. A rendszer webhookokon keresztül értesíti az Ön szolgáltatását; ki, hogyan és mikor kap értesítést, azt az Ön rendszere dönti el.

## Kapcsolódó

- [Viselhető eszközök adatai FHIR formátumban](https://developers.anpheros.com/hu/guides/wearable-data-fhir)
- [Virtuális ellátás és AI orvosok: a szükséges adatok](https://developers.anpheros.com/hu/guides/virtual-care-ai-data)
- [Webhookok](https://developers.anpheros.com/hu/guides/webhooks)
- [Az orvosi adatok eredetének magyarázata](https://developers.anpheros.com/hu/guides/medical-data-provenance)
- [Egészségügyi integrációk](https://developers.anpheros.com/hu/guides/healthcare-integrations)
