# Δεδομένα φορητών συσκευών σε FHIR (Apple Health, Health Connect)

> Λάβετε δεδομένα από smartwatch, δαχτυλίδια και ζυγαριές σε ένα αρχείο FHIR: ποιες συσκευές φτάνουν σε ποιο κατάστημα υγείας, έναν πίνακα αντιστοίχισης LOINC, ημερήσιες περιλήψεις και μια δοκιμασμένη ενημέρωση (upsert).

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

**Για να λάβετε δεδομένα από ένα smartwatch, δαχτυλίδι ή έξυπνη ζυγαριά σε ένα ιατρικό αρχείο, διαβάστε τα στο τηλέφωνο από το κατάστημα υγείας του λειτουργικού συστήματος — Apple Health σε iOS, Health Connect σε Android — συνοψίστε τα ανά ημέρα, αντιστοιχίστε κάθε μετρική σε έναν κωδικό LOINC και μια μονάδα UCUM, και γράψτε τα ως FHIR R4 Observations που έχουν επισημανθεί ως δεδομένα συσκευής.** Η ανάγνωση από το κατάστημα υγείας του τηλεφώνου αντί από το cloud κάθε προμηθευτή επιτρέπει σε μία ενσωμάτωση να καλύψει Apple Watch, Galaxy Watch, Pixel Watch, Garmin, Fitbit, Oura και Withings, εφόσον το άτομο έχει επιτρέψει την κοινή χρήση από την εφαρμογή του προμηθευτή του. Αυτή η σελίδα παρέχει τη διαδρομή δεδομένων, έναν πίνακα αντιστοίχισης που μπορείτε να επαναχρησιμοποιήσετε, ένα επικυρωμένο παράδειγμα FHIR και κώδικα που εκτελέστηκε στην πλατφόρμα.

## Η διαδρομή δεδομένων

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

Ούτε το Apple Health ούτε το Health Connect διαθέτουν API διακομιστή: τα δεδομένα μπορούν να διαβαστούν μόνο από μια εφαρμογή στο τηλέφωνο του ατόμου. Η εφαρμογή σας τα διαβάζει, στέλνει συμπυκνωμένες ημερήσιες τιμές στο backend σας και το backend τα εγγράφει στο αρχείο.

## Ποιες συσκευές φτάνουν σε ποιο health store

Αυτό που μοιράζεται κάθε πωλητής αλλάζει με τις εκδόσεις των εφαρμογών· η τεκμηρίωση του ίδιου του πωλητή είναι η αναφορά.

| Συσκευή ή εφαρμογή | Apple Health (iOS) | Health Connect (Android) | Σημειώσεις |
|---|---|---|---|
| Apple Watch | Ναι, εγγενώς | — | Ό,τι μετράει το ρολόι καταλήγει στο Apple Health |
| Samsung Galaxy Watch, Samsung Health | — | Μερικώς | Το Samsung Health αποφασίζει ποιοι τύποι εξάγονται και πόσο συχνά· δείτε [Samsung Health](https://developers.anpheros.com/el/guides/samsung-health-fhir) |
| Pixel Watch, Fitbit | Καμία επίσημη συγχρονισμός | Ναι, μέσω της εφαρμογής Fitbit ([Βοήθεια Google](https://support.google.com/fitbit/answer/14506680)) | |
| Garmin | Ναι, από το Garmin Connect μετά από κάθε συγχρονισμό συσκευής | Ναι, το Garmin Connect υποστηρίζει Health Connect σε Android 14 και νεότερες εκδόσεις ([Android Developers, Αύγουστος 2025](https://developer.android.com/health-and-fitness/community/newsletters/2025/08)) | Βαθμολογίες ειδικές για Garmin, όπως το Body Battery, δεν κοινοποιούνται |
| Oura | Ναι | Ναι ([Oura](https://ouraring.com/blog/data-sharing-partner-integrations/)) | Η βαθμολογία Readiness και άλλες βαθμολογίες Oura παραμένουν στην εφαρμογή Oura |
| Withings | Ναι, μέσω Health Mate | Ναι ([Android Developers blog](https://android-developers.googleblog.com/2023/03/withings-reduces-data-sync-code-with--health-and-fitness-api-health-connect.html)) | Ζυγαριές, πιεσόμετρα, ρολόγια |

Δύο πρακτικές συνέπειες. Πρώτον, η εφαρμογή σας εξαρτάται από το αν το άτομο έχει ενεργοποιήσει την κοινή χρήση στην εφαρμογή του πωλητή του· η εισαγωγή (onboarding) θα πρέπει να το αναφέρει. Δεύτερον, το health store μπορεί να περιέχει τα ίδια βήματα από δύο πηγές (ένα τηλέφωνο και ένα ρολόι)· διαβάστε τα ημερήσια σύνολα του ίδιου του store αντί να προσθέτετε δείγματα, επειδή το Apple Health και το Health Connect ήδη αφαιρούν διπλότυπες πηγές.

## Πίνακας αντιστοίχισης: τύπος καταστήματος υγείας → FHIR Observation

Οι κωδικοί που χρησιμοποιεί το Anpheros Daily κατά την εγγραφή δεδομένων από φορητές συσκευές σε ένα αρχείο FHIR:

| Μετρική | Apple HealthKit | Health Connect | LOINC | Μονάδα UCUM | Κατηγορία |
|---|---|---|---|---|---|
| Καρδιακός ρυθμός | `heartRate` | `HeartRateRecord` | 8867-4 | `/min` | vital-signs |
| Καρδιακός ρυθμός ηρεμίας | `restingHeartRate` | `RestingHeartRateRecord` | 40443-4 | `/min` | vital-signs |
| Μεταβλητότητα καρδιακού ρυθμού | `heartRateVariabilitySDNN` | `HeartRateVariabilityRmssdRecord` | 80404-7 (μόνο SDNN) | `ms` | vital-signs |
| Οξυγόνο αίματος (SpO₂) | `oxygenSaturation` | `OxygenSaturationRecord` | 59408-5 | `%` | vital-signs |
| Αναπνευστικός ρυθμός | `respiratoryRate` | `RespiratoryRateRecord` | 9279-1 | `/min` | vital-signs |
| Βήματα ανά ημέρα | `stepCount` | `StepsRecord` | 41950-7 | `{steps}` | activity |
| Ενεργειακή δαπάνη | `activeEnergyBurned` | `ActiveCaloriesBurnedRecord` | 41981-2 | `kcal` | activity |
| Διάρκεια ύπνου | `sleepAnalysis` (κατηγορία) | `SleepSessionRecord` | 93832-4; στάδια 93831-6 deep, 93830-8 light, 93829-0 REM | `min` | activity |
| Σωματικό βάρος | `bodyMass` | `WeightRecord` | 29463-7 | `kg` | vital-signs |
| Αρτηριακή πίεση | `bloodPressure` (συσχέτιση) | `BloodPressureRecord` | 85354-9 με 8480-6 και 8462-4 | `mm[Hg]` | vital-signs |
| Γλυκόζη αίματος (μετρητής) | `bloodGlucose` | `BloodGlucoseRecord` | 2339-0 | `mg/dL` | vital-signs |
| Θερμοκρασία σώματος | `bodyTemperature` | `BodyTemperatureRecord` | 8310-5 | `Cel` | vital-signs |

Παρατηρήστε τη γραμμή μεταβλητότητας καρδιακού ρυθμού: Το Apple Health αποθηκεύει **SDNN**, ενώ το Health Connect αποθηκεύει **RMSSD**. Πρόκειται για διαφορετικές στατιστικές και δεν πρέπει να εγγράφονται κάτω από τον ίδιο κωδικό. Το LOINC 80404-7 είναι SDNN· για RMSSD, το Anpheros Daily χρησιμοποιεί το δικό του σύστημα κωδικοποίησης αντί να προσποιείται ότι τα δύο είναι το ίδιο.

## Περιλήψεις, όχι κάθε δείγμα

Ένα ρολόι παράγει χιλιάδες δείγματα καρδιακών παλμών την ημέρα. Ένα ιατρικό αρχείο χρειάζεται κάτι που ένας άνθρωπος ή ένας γιατρός μπορεί να διαβάσει:

- **Μία Παρατήρηση (Observation) ανά μετρική ανά ημέρα**, με `effectivePeriod` που καλύπτουν την τοπική ημέρα του ατόμου, τον ημερήσιο μέσο όρο ή το σύνολο σε `valueQuantity` και, για τις τιμές ρυθμού, το ελάχιστο και το μέγιστο ως στοιχεία.
- **Λεπτότερες σειρές παραμένουν εκεί που είναι χρήσιμες.** Το Anpheros Daily διατηρεί περιλήψεις καρδιακών παλμών 4 ωρών για τα δικά του γραφήματα και γράφει ημερήσιες τιμές στο αρχείο FHIR.
- **Τα συμβάντα είναι ξεχωριστά.** Μια ειδοποίηση ακανόνιστου ρυθμού ή μια μεμονωμένη μέτρηση αρτηριακής πίεσης είναι η δική της Παρατήρηση (Observation) με τη δική της ώρα, όχι μέρος ενός ημερήσιου μέσου όρου.

Μια ημερήσια περίληψη καρδιακών παλμών ως FHIR R4 (περνάει από τον [ελεγκτή FHIR R4](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)"}
}
```

## Εγγραφή ημερήσιων τιμών χωρίς διπλότυπα

Τα τηλέφωνα συγχρονίζονται αρκετές φορές την ημέρα, και η τελευταία τιμή μιας ημέρας αλλάζει μέχρι τα μεσάνυχτα. Δώστε σε κάθε Observation ένα σταθερό αναγνωριστικό — άτομο, ημέρα, μετρική — και ενημερώστε το αντί να δημιουργήσετε ένα νέο. Με το Anpheros TypeScript SDK, στο 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 });
}
```

Η εκτέλεση σε μια τοπική παρουσία της πλατφόρμας με ένα κλειδί sandbox, δύο ημερήσιες τιμές που ακολουθούνται από έναν μεταγενέστερο συγχρονισμό των βημάτων της ίδιας ημέρας άφησαν **δύο** Observations, το ένα για τα βήματα στην έκδοση 2 με τη νέα τιμή, και την προέλευση `v1 device apple-health · v2 device`. Το ιστορικό διατηρεί την προηγούμενη τιμή, και κάθε αναγνώστης μπορεί να δει ότι τα δεδομένα προήλθαν από μια συσκευή, όχι από έναν κλινικό ιατρό.

Στην παραγωγή, χρησιμοποιήστε τα πραγματικά όρια της ημέρας στη ζώνη ώρας του ατόμου (το παραπάνω παράδειγμα χρησιμοποιεί UTC για συντομία), όπως κάνουν ο κώδικας HealthKit και Health Connect στις σελίδες της πλατφόρμας.

## Ανάγνωση από το τηλέφωνο

- **iPhone και Apple Watch:** [Apple Health (HealthKit) σε FHIR](https://developers.anpheros.com/el/guides/apple-health-fhir), με κώδικα Swift για καθημερινά στατιστικά.
- **Android, Wear OS, Fitbit, Garmin, Oura, Withings:** [Health Connect σε FHIR](https://developers.anpheros.com/el/guides/health-connect-fhir), με κώδικα Flutter που λειτουργεί και στις δύο πλατφόρμες.
- **Samsung Galaxy Watch και Samsung Health:** [Samsung Health σε FHIR](https://developers.anpheros.com/el/guides/samsung-health-fhir): τι φτάνει στο Health Connect και τι χρειάζεται το δικό του SDK της Samsung.

## Κανόνες που αξίζει να ακολουθήσετε

- **Διαβάστε μόνο ό,τι χρησιμοποιείτε**, και ζητήστε κάθε τύπο ξεχωριστά· οι χρήστες χορηγούν μερικές άδειες.
- **Επισημάνετε την πηγή.** Τα φορητά αξεσουάρ καταναλωτών δεν είναι διαγνωστικές συσκευές. Καταγράψτε τα δεδομένα τους ως δεδομένα συσκευής (`author_type: device`) και αναφέρετε από ποια εφαρμογή προήλθαν, ώστε ένας κλινικός ιατρός να μπορεί να τα αξιολογήσει αναλόγως.
- **Σεβαστείτε τους κανόνες της πλατφόρμας.** Οι Οδηγίες Επανεξέτασης Εφαρμογών της Apple (5.1.3) απαγορεύουν τη χρήση δεδομένων υγείας για διαφήμιση και την αποθήκευση προσωπικών πληροφοριών υγείας στο iCloud· το Google Play απαιτεί δήλωση εφαρμογών υγείας για εφαρμογές που χρησιμοποιούν το Health Connect.
- **Επιτρέψτε στους χρήστες να αποσυνδεθούν** και να αποφασίσουν αν τα δεδομένα που έχουν ήδη αντιγραφεί παραμένουν στο αρχείο.

## Τι κάνει και τι δεν κάνει το Anpheros

Η Πλατφόρμα Anpheros δεν συνδέεται αυτόματα με το Apple Health, το Health Connect ή οποιοδήποτε cloud προμηθευτή: η εφαρμογή σας διαβάζει τα δεδομένα στο τηλέφωνο και τα γράφει μέσω του API. Η δική του εφαρμογή Anpheros, η **Anpheros Daily**, κάνει ακριβώς αυτό: διαβάζει το Apple Health στο iPhone και το Health Connect στο Android, διατηρεί ημερήσιες περιλήψεις και τις γράφει στο αρχείο FHIR του ατόμου με τους παραπάνω κωδικούς. Η σύνδεση συσκευών αποτελεί μέρος των προγραμμάτων Plus και Max.

## Συχνές Ερωτήσεις

### Πώς μπορώ να εισαγάγω δεδομένα από το Apple Watch σε έναν διακομιστή FHIR;
Διαβάστε τα στο iPhone από το Apple Health με το HealthKit (δεν υπάρχει API διακομιστή), συνοψίστε τα ανά ημέρα και κάντε το backend σας να γράψει κάθε μετρική ως Observation με κωδικό LOINC και μονάδα UCUM, επισημασμένη ως δεδομένα συσκευής.

### Υπάρχει cloud API για το Health Connect ή το Apple Health;
Όχι. Και τα δύο διατηρούν δεδομένα στο τηλέφωνο· μια εφαρμογή εγκατεστημένη στο τηλέφωνο τα διαβάζει με την άδεια του ατόμου. Cloud παρόχων όπως της Garmin, Fitbit ή Oura έχουν τα δικά τους API, αλλά η ανάγνωση του καταστήματος υγείας του τηλεφώνου καλύπτει τα περισσότερα από αυτά με μία ενσωμάτωση.

### Ποιον κωδικό LOINC πρέπει να χρησιμοποιήσω για τα βήματα;
41950-7, "Number of steps in 24 hour Measured", με ημερήσιο `effectivePeriod`. Για τον καρδιακό ρυθμό χρησιμοποιήστε 8867-4, για SpO₂ 59408-5, για τη διάρκεια ύπνου 93832-4.

### Πρέπει να αποθηκεύσω κάθε δείγμα καρδιακού ρυθμού στο FHIR;
Συνήθως όχι. Μια ημερήσια σύνοψη με μέσο όρο, ελάχιστο και μέγιστο είναι αυτό που διαβάζει ένα άτομο ή κλινικός· μεμονωμένες μετρήσεις ανήκουν στο αρχείο μόνο όταν έχουν σημασία από μόνες τους, όπως ένα γεγονός ακανόνιστου ρυθμού.

### Μπορώ να χρησιμοποιήσω έναν κωδικό για HRV από το Apple Health και το Health Connect;
Όχι. Το Apple Health αναφέρει SDNN και το Health Connect αναφέρει RMSSD· μετρούν διαφορετικά πράγματα και χρειάζονται διαφορετικούς κωδικούς.

## Σχετικά

- [APIs φορητών συσκευών: Fitbit, Garmin, Oura και Withings](https://developers.anpheros.com/el/guides/wearable-apis)
- [API παρακολούθησης υγείας](https://developers.anpheros.com/el/guides/health-tracker-api): αποθήκευση δεδομένων παρακολούθησης σε διακομιστή, με συναίνεση
- [Πώς να δημιουργήσετε μια εφαρμογή προσωπικού ιατρικού φακέλου](https://developers.anpheros.com/el/guides/personal-health-record-app)
- [Ενσωματώσεις υγειονομικής περίθαλψης](https://developers.anpheros.com/el/guides/healthcare-integrations): συσκευές παράλληλα με εργαστήρια, κλινικές και εφαρμογές
- [Συστήματα κώδικα FHIR](https://developers.anpheros.com/el/guides/fhir-code-systems): LOINC και UCUM
- [Επεξήγηση προέλευσης ιατρικών δεδομένων](https://developers.anpheros.com/el/guides/medical-data-provenance)
- [Πώς να κανονικοποιήσετε ιατρικά δεδομένα](https://developers.anpheros.com/el/guides/normalize-medical-data)
- [Απομακρυσμένη παρακολούθηση ασθενών με FHIR](https://developers.anpheros.com/el/guides/remote-patient-monitoring-fhir): μεμονωμένες μετρήσεις, webhooks και ειδοποιήσεις
