# Diaľkové monitorovanie pacienta pomocou FHIR

> Od údajov o krvnom tlaku z domu po upozornenia: pozorovania zo zariadení, podpísané webové háčiky, idempotentné pravidlo a to, čo zostáva mimo dátovej vrstvy. Testovaný kód.

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

**Diaľkové monitorovanie pacienta (RPM) zhromažďuje merania, ktoré si pacient vykonáva doma — krvný tlak, hmotnosť, glukóza, saturácia kyslíkom — a umožňuje tímu starostlivosti ich vidieť a reagovať na ne medzi návštevami.** Dátová časť má štyri kroky: dostať každé meranie do záznamu pacienta ako kódované pozorovanie pripísané zariadeniu; reagovať, keď príde nové meranie; rozhodnúť pomocou jasného pravidla, či si vyžaduje pozornosť; a viesť záznam o tom, čo tím urobil. Táto stránka buduje tento proces na HL7 FHIR R4 s Anpheros webovými háčikmi a TypeScript SDK, s kódom, ktorý bol spustený proti platforme, a uvádza, čo zostáva mimo dátovej vrstvy.

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

Tri možnosti rozhodujú, či to bude v praxi fungovať:

- **Jedno meranie, jedna Observation.** Každé meranie z manžety je Observation s LOINC 85354-9 a dvoma komponentmi (8480-6 systolický, 8462-4 diastolický), časom merania a `author_type: device`. Na rozdiel od denných súhrnov z nositeľných zariadení, RPM merania sú individuálne merania, na ktoré sa lekár môže pozerať jedno po druhom.
- **Reagovať na udalosti, nie na časovač.** Webhook pre každú novú Observation umožňuje spustenie pravidla sekundy po príchode merania.
- **Pravidlá pre viacero meraní.** Jedno vysoké meranie je často šum; väčšina protokolov sa pozerá na sériu. Pravidlo nižšie vyžaduje tri po sebe idúce merania na úrovni alebo nad 140/90. Táto prahová hodnota je príklad, nie klinické odporúčanie: tím starostlivosti nastavuje pravidlo pre každého pacienta.

## Zapisovanie hodnôt zo zariadenia

Telefónna aplikácia (alebo cloud dodávateľa zariadenia prostredníctvom vášho backendu) zapisuje každú hodnotu:

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

Ak hodnoty prichádzajú cez Apple Health alebo Health Connect namiesto priamo zo zariadenia, prečítajte si ich v telefóne podľa popisu v časti [Údaje z nositeľných zariadení vo formáte FHIR](https://developers.anpheros.com/sk/guides/wearable-data-fhir), ale ponechajte jednotlivé hodnoty krvného tlaku ako samostatné Observations namiesto denného priemeru.

## Reagovanie na nové údaje

Zaregistrujte koncový bod webhooku raz (`POST /v1/webhooks` s `events: ["resource.created"]`); odpoveď bude obsahovať podpisový tajný kód. Potom spustite malú službu, ktorá overí každé doručenie a vyhodnotí pravidlo:

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

Ako sme to testovali: štyri ranné údaje (136/86, 144/92, 149/94, 152/95) boli zapísané do syntetického pacienta na lokálnej inštancii platformy a platforma vygenerovala jednu podpísanú udalosť `resource.created` na jeden údaj. Tieto udalosti, podpísané vlastným podpisovým kódom platformy, boli odoslané vyššie uvedenej službe spolu s dvoma duplikátmi a jednou požiadavkou podpísanou nesprávnym tajným kódom. Výsledok: nesprávny podpis dostal `400`, duplikáty boli ignorované a služba vyvolala presne jedno upozornenie — `152/95, 149/94, 144/92` — nie jedno na udalosť.

V produkcii uchovávajte `seen` a `alerted` v databáze namiesto v pamäti, aby reštart neopakoval upozornenia.

**Prijímanie webhookov počas vývoja.** Anpheros akceptuje a doručuje iba na verejné HTTPS koncové body: `localhost` alebo súkromná adresa je odmietnutá pri registrácii (`400`, pole `url`), a to aj v sandboxe, a každé doručenie adresu opätovne skontroluje. Ak chcete prijímať udalosti na svojom notebooku, vystavte službu cez verejný HTTPS tunel a zaregistrujte adresu tunela. Pozri [Webhooks](https://developers.anpheros.com/sk/guides/webhooks).

## Čo by mal záznam zobrazovať následne

Samotné upozornenie žije vo vašej monitorovacej službe, ale záznam by mal zobrazovať, čo z neho vyplynulo, aby ďalší lekár a pacient videli celý príbeh:

- namerané hodnoty, každá označená ako dáta zo zariadenia s jej zdrojovým systémom ([proveniencia](https://developers.anpheros.com/sk/guides/medical-data-provenance));
- `CarePlan` s monitorovacím plánom (čo sa meria, ako často, cieľ);
- `Encounter` (klasifikácia `VR` pre vzdialený kontakt) keď tím zavolá pacientovi, a akákoľvek zmena liekov ako `MedicationStatement`.

Anpheros ukladá tieto zdroje; nemá vlastný zdroj upozornení alebo úloh (`Flag`, `Task` a `Communication` nie sú medzi jeho typmi zdrojov), takže fronty upozornení a smerovanie pohotovostí patria vašej službe.

## Fakturácia, regulácia a bezpečnosť

Programy RPM často závisia od pravidiel úhrady — v Spojených štátoch Medicare platí za diaľkové fyziologické monitorovanie pod špecifickými CPT kódmi s minimálnym počtom dní s údajmi a časom stráveným tímom starostlivosti. Tieto pravidlá sa menia a nie sú niečím, čo môže dátová platforma certifikovať; skontrolujte aktuálne pravidlá CMS a uchovávajte dôkazy (údaje a čas tímu) vo svojom vlastnom systéme. Softvér, ktorý interpretuje údaje na účely diagnózy alebo liečby, môže byť regulovaný ako zdravotnícka pomôcka. Prahové hodnoty ponechajte v rukách klinikov a zaznamenávajte každé upozornenie a reakciu.

## Kde Anpheros zapadá

Anpheros poskytuje záznam (FHIR R4 Observations s pôvodom, CarePlan, Encounter), podpísané webové háčiky s opakovanými pokusmi, súhlas, ak aplikácia inej organizácie potrebuje čítať údaje, a denník prístupu, ktorý môže pacient vidieť. Nepripojuje sa k predajcom zariadení, nerozhoduje o tom, čo je abnormálne, neposiela upozornenia ani nezabezpečuje fakturáciu.

## Často kladené otázky

### Ktorý FHIR resource ukladá údaj o domácom krvnom tlaku?
Observation s LOINC 85354-9 (panel krvného tlaku) a dvoma komponentmi, 8480-6 (systolický) a 8462-4 (diastolický), každý `valueQuantity` v `mm[Hg]`, s časom merania a zariadením ako autorom.

### Má byť RPM dátami denný priemer alebo individuálne údaje?
Individuálne údaje pre klinické merania ako krvný tlak, váha alebo glukóza, pretože ich klinici kontrolujú a počítajú. Denné súhrny sú vhodné pre vysokofrekvenčné údaje z nositeľných zariadení ako srdcový tep alebo kroky.

### Ako spustím upozornenie, keď príde nový údaj?
Prihláste sa na odber `resource.created` webhookov, overte podpis, načítajte novú Observation a vyhodnoťte svoje pravidlo nad nedávnou sériou. Dodávky sa môžu opakovať, preto deduplikujte podľa ID udalosti a urobte upozornenie idempotentným.

### Môže Anpheros posielať upozornenia klinikom?
Nie. Notifikuje vašu službu prostredníctvom webhookov; kto je upozornený, ako a kedy sa rozhoduje vo vašom systéme.

## Súvisiace témy

- [Údaje z nositeľných zariadení vo formáte FHIR](https://developers.anpheros.com/sk/guides/wearable-data-fhir)
- [Virtuálna starostlivosť a AI lekári: aké údaje potrebujú](https://developers.anpheros.com/sk/guides/virtual-care-ai-data)
- [Webhooks](https://developers.anpheros.com/sk/guides/webhooks)
- [Vysvetlenie pôvodu lekárskych údajov](https://developers.anpheros.com/sk/guides/medical-data-provenance)
- [Integrácie v zdravotníctve](https://developers.anpheros.com/sk/guides/healthcare-integrations)
