# Wearable-Daten in FHIR (Apple Health, Health Connect)

> Smartwatch-, Ring- und Waagendaten in einen FHIR-Datensatz übertragen: welche Geräte welche Gesundheitsdaten speichern, eine LOINC-Mapping-Tabelle, tägliche Zusammenfassungen und ein getesteter Upsert.

Source: https://developers.anpheros.com/de/guides/wearable-data-fhir

**Um Daten von einer Smartwatch, einem Ring oder einer Smartwaage in einen medizinischen Datensatz zu übertragen, lesen Sie diese auf dem Telefon aus dem Health Store des Betriebssystems – Apple Health unter iOS, Health Connect unter Android –, fassen Sie sie pro Tag zusammen, ordnen Sie jede Metrik einem LOINC-Code und einer UCUM-Einheit zu und schreiben Sie sie als FHIR R4 Observations, die als Gerätedaten markiert sind.** Das Lesen aus dem Health Store des Telefons anstelle der Cloud jedes Anbieters ermöglicht eine einzige Integration, die Apple Watch, Galaxy Watch, Pixel Watch, Garmin, Fitbit, Oura und Withings abdeckt, solange die Person ihrer Anbieter-App die Freigabe erlaubt hat. Diese Seite bietet den Datenpfad, eine Mapping-Tabelle, die Sie wiederverwenden können, ein validiertes FHIR-Beispiel und Code, der gegen die Plattform ausgeführt wurde.

## Der Datenpfad

```
 watch, ring, scale ──► vendor app (Garmin Connect, Fitbit, Oura, Withings, Samsung Health…)
                              │  shares, with the person's permission
                              ▼
                 Apple Health (iOS)  /  Health Connect (Android)
                              │  your app reads, with the person's permission, on the phone
                              ▼
                 your app ──► your backend ──► FHIR R4 Observations in the person's record
```

Weder Apple Health noch Health Connect verfügen über eine Server-API: Daten können nur von einer App auf dem Telefon der Person gelesen werden. Ihre App liest diese Daten, sendet kompakte tägliche Werte an Ihr Backend, und das Backend schreibt sie in den Datensatz.

## Welche Geräte erreichen welchen Health Store

Was jeder Anbieter teilt, ändert sich mit den App-Versionen; die eigene Dokumentation des Anbieters ist die Referenz.

| Gerät oder App | Apple Health (iOS) | Health Connect (Android) | Anmerkungen |
|---|---|---|---|
| Apple Watch | Ja, nativ | — | Alles, was die Uhr misst, landet in Apple Health |
| Samsung Galaxy Watch, Samsung Health | — | Teilweise | Samsung Health entscheidet, welche Typen exportiert werden und wie oft; siehe [Samsung Health](https://developers.anpheros.com/de/guides/samsung-health-fhir) |
| Pixel Watch, Fitbit | Keine offizielle Synchronisierung | Ja, über die Fitbit-App ([Google Hilfe](https://support.google.com/fitbit/answer/14506680)) | |
| Garmin | Ja, von Garmin Connect nach jeder Gerätesynchronisierung | Ja, Garmin Connect unterstützt Health Connect ab Android 14 ([Android Developers, August 2025](https://developer.android.com/health-and-fitness/community/newsletters/2025/08)) | Garmin-spezifische Werte wie Body Battery werden nicht geteilt |
| Oura | Ja | Ja ([Oura](https://ouraring.com/blog/data-sharing-partner-integrations/)) | Readiness und andere Oura-Werte bleiben in der Oura-App |
| Withings | Ja, über Health Mate | Ja ([Android Developers Blog](https://android-developers.googleblog.com/2023/03/withings-reduces-data-sync-code-with--health-and-fitness-api-health-connect.html)) | Waagen, Blutdruckmessgeräte, Uhren |

Zwei praktische Konsequenzen. Erstens hängt Ihre App davon ab, dass die Person das Teilen in ihrer Anbieter-App aktiviert hat; das Onboarding sollte dies erwähnen. Zweitens kann der Health Store dieselben Schritte aus zwei Quellen (ein Telefon und eine Uhr) enthalten; lesen Sie die eigenen Tagesgesamtsummen des Stores, anstatt Stichproben zusammenzuzählen, da Apple Health und Health Connect bereits überlappende Quellen de-duplizieren.

## Mappingtabelle: Health Store Typ → FHIR Observation

Die Codes, die Anpheros Daily beim Schreiben von Wearable-Daten in einen FHIR-Datensatz verwendet:

| Metrik | Apple HealthKit | Health Connect | LOINC | UCUM-Einheit | Kategorie |
|---|---|---|---|---|---|
| Herzfrequenz | `heartRate` | `HeartRateRecord` | 8867-4 | `/min` | vital-signs |
| Ruheherzfrequenz | `restingHeartRate` | `RestingHeartRateRecord` | 40443-4 | `/min` | vital-signs |
| Herzfrequenzvariabilität | `heartRateVariabilitySDNN` | `HeartRateVariabilityRmssdRecord` | 80404-7 (nur SDNN) | `ms` | vital-signs |
| Blutsauerstoff (SpO₂) | `oxygenSaturation` | `OxygenSaturationRecord` | 59408-5 | `%` | vital-signs |
| Atemfrequenz | `respiratoryRate` | `RespiratoryRateRecord` | 9279-1 | `/min` | vital-signs |
| Schritte pro Tag | `stepCount` | `StepsRecord` | 41950-7 | `{steps}` | activity |
| Aktive Energie | `activeEnergyBurned` | `ActiveCaloriesBurnedRecord` | 41981-2 | `kcal` | activity |
| Schlafdauer | `sleepAnalysis` (Kategorie) | `SleepSessionRecord` | 93832-4; Stadien 93831-6 Deep, 93830-8 Light, 93829-0 REM | `min` | activity |
| Körpergewicht | `bodyMass` | `WeightRecord` | 29463-7 | `kg` | vital-signs |
| Blutdruck | `bloodPressure` (Korrelation) | `BloodPressureRecord` | 85354-9 mit 8480-6 und 8462-4 | `mm[Hg]` | vital-signs |
| Blutzucker (Messgerät) | `bloodGlucose` | `BloodGlucoseRecord` | 2339-0 | `mg/dL` | vital-signs |
| Körpertemperatur | `bodyTemperature` | `BodyTemperatureRecord` | 8310-5 | `Cel` | vital-signs |

Beachten Sie die Zeile für die Herzfrequenzvariabilität: Apple Health speichert **SDNN**, Health Connect speichert **RMSSD**. Dies sind unterschiedliche Statistiken und dürfen nicht unter demselben Code geschrieben werden. LOINC 80404-7 ist SDNN; für RMSSD verwendet Anpheros Daily ein eigenes Codesystem, anstatt vorzugeben, die beiden seien identisch.

## Zusammenfassungen, nicht jede Stichprobe

Eine Uhr produziert Tausende von Herzfrequenz-Stichproben pro Tag. Eine Krankenakte benötigt etwas, das eine Person oder ein Arzt lesen kann:

- **Eine Observation pro Metrik pro Tag**, wobei `effectivePeriod` den lokalen Tag der Person, den Tagesdurchschnitt oder das Tagesergebnis in `valueQuantity` abdeckt und für Raten das Minimum und Maximum als Komponenten enthält.
- **Feinere Serien bleiben dort, wo sie nützlich sind.** Anpheros Daily behält 4-Stunden-Herzfrequenz-Zusammenfassungen für seine eigenen Diagramme und schreibt tägliche Werte in die FHIR-Aufzeichnung.
- **Ereignisse sind getrennt.** Eine Benachrichtigung über einen unregelmäßigen Rhythmus oder eine einzelne Blutdruckmessung ist eine eigene Observation mit eigener Zeit, nicht Teil eines Tagesdurchschnitts.

Eine tägliche Herzfrequenz-Zusammenfassung als FHIR R4 (sie besteht den [FHIR R4 Validator](https://developers.anpheros.com/tools/fhir-validator)):

```json
{
  "resourceType": "Observation",
  "status": "final",
  "identifier": [{"system": "https://your-app.test/fhir/sid/daily-wearable", "value": "p-123:2026-10-01:heart_rate"}],
  "category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "vital-signs"}]}],
  "code": {"coding": [{"system": "http://loinc.org", "code": "8867-4", "display": "Heart rate"}]},
  "subject": {"reference": "Patient/p-123"},
  "effectivePeriod": {"start": "2026-10-01T00:00:00-04:00", "end": "2026-10-02T00:00:00-04:00"},
  "valueQuantity": {"value": 71.4, "unit": "/min", "system": "http://unitsofmeasure.org", "code": "/min"},
  "component": [
    {"code": {"text": "minimum"}, "valueQuantity": {"value": 52, "unit": "/min", "system": "http://unitsofmeasure.org", "code": "/min"}},
    {"code": {"text": "maximum"}, "valueQuantity": {"value": 138, "unit": "/min", "system": "http://unitsofmeasure.org", "code": "/min"}}
  ],
  "device": {"display": "Apple Watch (via Apple Health)"}
}
```

## Tägliche Werte ohne Duplikate schreiben

Telefone synchronisieren mehrmals täglich, und der letzte Wert eines Tages ändert sich bis Mitternacht. Geben Sie jeder Observation eine stabile Kennung – Person, Tag, Metrik – und aktualisieren Sie diese, anstatt eine neue zu erstellen. Mit dem Anpheros TypeScript SDK auf Ihrem Backend:

```ts
import { Anpheros, apiKey } from '@anpheros/sdk';

const anpheros = new Anpheros({ auth: apiKey(process.env.ANPHEROS_KEY!) });

// What the phone sends: one value per metric per local day
type DailyValue = { metric: 'heart_rate' | 'steps'; day: string; value: number; min?: number; max?: number };

const CODES = {
  heart_rate: { code: '8867-4', display: 'Heart rate', unit: '/min', category: 'vital-signs' },
  steps: { code: '41950-7', display: 'Number of steps in 24 hour Measured', unit: '{steps}', category: 'activity' },
} as const;

// One Observation per person, metric and day: re-sending a day updates it instead of adding a copy.
async function upsertDaily(patientId: string, v: DailyValue, source: string) {
  const c = CODES[v.metric];
  const identifier = { system: 'https://your-app.test/fhir/sid/daily-wearable', value: `${patientId}:${v.day}:${v.metric}` };
  const resource: any = {
    resourceType: 'Observation', status: 'final',
    identifier: [identifier],
    category: [{ coding: [{ system: 'http://terminology.hl7.org/CodeSystem/observation-category', code: c.category }] }],
    code: { coding: [{ system: 'http://loinc.org', code: c.code, display: c.display }] },
    subject: { reference: `Patient/${patientId}` },
    effectivePeriod: { start: `${v.day}T00:00:00Z`, end: `${v.day}T23:59:59Z` },
    valueQuantity: { value: v.value, unit: c.unit, system: 'http://unitsofmeasure.org', code: c.unit },
  };
  if (v.min !== undefined && v.max !== undefined) {
    resource.component = [
      { code: { text: 'minimum' }, valueQuantity: { value: v.min, unit: c.unit, system: 'http://unitsofmeasure.org', code: c.unit } },
      { code: { text: 'maximum' }, valueQuantity: { value: v.max, unit: c.unit, system: 'http://unitsofmeasure.org', code: c.unit } },
    ];
  }
  const found = await anpheros.fhir.search('Observation', { identifier: `${identifier.system}|${identifier.value}` });
  const existing = found.entry?.[0]?.resource;
  return existing
    ? anpheros.fhir.update({ ...resource, id: existing.id }, { author_type: 'device' })
    : anpheros.fhir.create(resource, { author_type: 'device', source_system: source });
}
```

Wenn Sie gegen eine lokale Instanz der Plattform mit einem Sandbox-Schlüssel ausführen, führten zwei tägliche Werte, gefolgt von einer späteren Synchronisierung desselben Tages, zu **zwei** Observations, wobei die Schritte eine bei Version 2 mit dem neuen Wert und die Herkunft `v1 device apple-health · v2 device` waren. Die Historie behält den früheren Wert, und jeder Leser kann sehen, dass die Daten von einem Gerät und nicht von einem Kliniker stammen.

In der Produktion verwenden Sie die tatsächlichen Tagesgrenzen in der Zeitzone der Person (das obige Beispiel verwendet UTC zur Kürze), wie der HealthKit- und Health Connect-Code auf den Plattformseiten.

## Lesen von Telefondaten

- **iPhone und Apple Watch:** [Apple Health (HealthKit) zu FHIR](https://developers.anpheros.com/de/guides/apple-health-fhir), mit Swift-Code für tägliche Statistiken.
- **Android, Wear OS, Fitbit, Garmin, Oura, Withings:** [Health Connect zu FHIR](https://developers.anpheros.com/de/guides/health-connect-fhir), mit Flutter-Code, der auf beiden Plattformen funktioniert.
- **Samsung Galaxy Watch und Samsung Health:** [Samsung Health zu FHIR](https://developers.anpheros.com/de/guides/samsung-health-fhir): was Health Connect erreicht und was das eigene SDK von Samsung benötigt.

## Regeln, die es wert sind, befolgt zu werden

- **Lies nur, was du verwendest**, und frage für jeden Typ separat an; Personen gewähren Teilberechtigungen.
- **Beschrifte die Quelle.** Wearables von Verbrauchern sind keine Diagnosegeräte. Schreibe ihre Daten als Gerätedaten (`author_type: device`) und gib an, aus welcher App sie stammen, damit ein Kliniker sie entsprechend gewichten kann.
- **Beachte die Plattformregeln.** Apples App Review Guidelines (5.1.3) verbieten die Verwendung von Gesundheitsdaten für Werbung und die Speicherung persönlicher Gesundheitsinformationen in iCloud; Google Play verlangt eine Erklärung für Gesundheits-Apps für Apps, die Health Connect verwenden.
- **Lass die Leute die Verbindung trennen** und entscheiden, ob die bereits kopierten Daten im Datensatz verbleiben.

## Was Anpheros leistet und was nicht

Die Anpheros Platform verbindet sich nicht von selbst mit Apple Health, Health Connect oder einer Anbieter-Cloud: Ihre App liest die Daten auf dem Telefon und schreibt sie über die API. Die eigene App von Anpheros, **Anpheros Daily**, tut genau das: Sie liest Apple Health auf dem iPhone und Health Connect auf Android, erstellt tägliche Zusammenfassungen und schreibt diese mit den oben genannten Codes in den FHIR-Datensatz der Person. Die Verbindung von Geräten ist Teil der Plus- und Max-Pläne.

## Häufig gestellte Fragen

### Wie bekomme ich Apple Watch-Daten auf einen FHIR-Server?
Lesen Sie sie auf dem iPhone aus Apple Health mit HealthKit (es gibt keine Server-API), fassen Sie sie pro Tag zusammen und lassen Sie Ihr Backend jede Metrik als Observation mit einem LOINC-Code und einer UCUM-Einheit schreiben, die als Gerätedaten gekennzeichnet sind.

### Gibt es eine Cloud-API für Health Connect oder Apple Health?
Nein. Beide speichern Daten auf dem Telefon; eine auf dem Telefon installierte App liest sie mit der Erlaubnis der Person. Anbieter-Clouds wie Garmin, Fitbit oder Oura haben ihre eigenen APIs, aber das Lesen des Gesundheitsspeichers des Telefons deckt die meisten davon mit einer einzigen Integration ab.

### Welchen LOINC-Code soll ich für Schritte verwenden?
41950-7, "Number of steps in 24 hour Measured", mit einem täglichen `effectivePeriod`. Für die Herzfrequenz verwenden Sie 8867-4, für SpO₂ 59408-5, für die Schlafdauer 93832-4.

### Sollte ich jede Herzfrequenz-Stichprobe in FHIR speichern?
Normalerweise nicht. Eine tägliche Zusammenfassung mit Durchschnitt, Minimum und Maximum ist das, was eine Person oder ein Kliniker liest; einzelne Messwerte gehören nur dann in den Datensatz, wenn sie für sich genommen wichtig sind, wie z. B. ein unregelmäßiges Rhythmusereignis.

### Kann ich einen Code für HRV von Apple Health und Health Connect verwenden?
Nein. Apple Health meldet SDNN und Health Connect meldet RMSSD; sie messen unterschiedliche Dinge und benötigen unterschiedliche Codes.

## Verwandte Themen

- [Wearable APIs: Fitbit, Garmin, Oura und Withings](https://developers.anpheros.com/de/guides/wearable-apis)
- [Health Tracker API](https://developers.anpheros.com/de/guides/health-tracker-api): Speichern von Tracker-Daten auf einem Server mit Zustimmung
- [So erstellen Sie eine Personal Health Record App](https://developers.anpheros.com/de/guides/personal-health-record-app)
- [Gesundheitsintegrationen](https://developers.anpheros.com/de/guides/healthcare-integrations): Geräte neben Laboren, Kliniken und Apps
- [FHIR-Codesysteme](https://developers.anpheros.com/de/guides/fhir-code-systems): LOINC und UCUM
- [Erklärung der Herkunft medizinischer Daten](https://developers.anpheros.com/de/guides/medical-data-provenance)
- [So normalisieren Sie medizinische Daten](https://developers.anpheros.com/de/guides/normalize-medical-data)
- [Remote Patient Monitoring mit FHIR](https://developers.anpheros.com/de/guides/remote-patient-monitoring-fhir): Einzelne Messwerte, Webhooks und Benachrichtigungen
