In Nederland groeit de behoefte aan betere digitale samenwerking in de zorg. Steeds meer organisaties kiezen daarom voor een combinatie van openEHR, voor de semantisch rijke opslag van zorggegevens, en HL7 FHIR, voor standaarduitwisseling tussen systemen.
Maar hoe verbind je die twee standaarden op een manier die praktisch uitvoerbaar is én behoud van datakwaliteit garandeert?
Deze blog is voor iedereen die werkt aan gegevensuitwisseling in de zorg: architecten, projectleiders, informatiemanagers en leveranciers. Je krijgt praktische antwoorden én een concreet voorbeeld. Je ontdekt hoe je mappings maakt tussen openEHR en HL7 FHIR, met behulp van de FHIRconnect-specificaties en openFHIR-engine.

Marc van Aalten
Marc is Interoperability Expert en heeft de FHIRconnect-specificaties en openFHIR-engine getest.
Het probleem: versnipperde data en complexe vertalingen
In de praktijk zijn zorggegevens opgeslagen in verschillende bronsystemen, elk met hun eigen datastructuren. Om deze informatie uit te wisselen, worden gegevens via mappings omgezet naar HL7 FHIR. Dat klinkt logisch, maar brengt uitdagingen met zich mee:
- Complexe mappings: Elk bronsysteem vereist maatwerk om data correct te vertalen naar het juiste FHIR-profiel. Kleine verschillen in interpretatie leiden al snel tot fouten of verlies van details.
- Intensief onderhoud: FHIR-profielen en bronsystemen veranderen regelmatig. Denk aan software-updates of nieuwe versies van FHIR-profielen. Mappings moeten dan worden bijgewerkt, getest en opnieuw gevalideerd.
- Risico op dataverlies: Vertalingen brengen het risico met zich mee dat klinische nuances verloren gaan. Zeker wanneer bronsystemen meer of andere informatie bevatten dan standaard in FHIR past.
Kortom: zonder een duurzame, semantisch geborgde aanpak blijven zorginstellingen veel tijd, geld en energie steken in het bouwen en onderhouden van mappings.
De oplossing: openEHR en HL7 FHIR verbinden met de FHIRconnect-specificaties
De combinatie van openEHR en HL7 FHIR biedt het beste van twee werelden. Maar om de verbinding tussen die werelden goed te organiseren, heb je slimme vertaallogica nodig.Daarvoor zijn de FHIRconnect-specificaties ontwikkeld.
Wat zijn de FHIRconnect-specificaties?
De FHIRconnect-specificaties beschrijven hoe je openEHR-composities en FHIR-profielen met elkaar verbindt. Je schrijft één mappingbestand in YAML-formaat dat werkt in beide richtingen: van FHIR naar openEHR én andersom.
Omdat deze specificaties leveranciersneutraal zijn, kunnen ze breed worden toegepast. Elke engine die de standaard ondersteunt, kan de mappings uitvoeren. De openFHIR-engine is daarvan een concreet voorbeeld.
In afbeelding 1 zie je hoe de openFHIR-engine deze mappings uitvoert: links realtime, rechts via synchronisatie op database-niveau.

Eén open ecosysteem, gebaseerd op bestaande standaarden
Met openEHR als fundament voor de opslag van zorggegevens, HL7 FHIR voor de uitwisseling, en openFHIR als verbindende schakel, ontstaat een open ecosysteem dat schaalbaar en onderhoudbaar is.
Een bloeddrukmeting mappen in de praktijk
Je hoeft geen programmeur te zijn om mappings te maken, maar een stevige inhoudelijke kennis van HL7 FHIR en openEHR is wel essentieel. Je moet de datamodellen, profielen en terminologieën begrijpen om correcte en duurzame mappings te kunnen bouwen.
Met deze expertise kun je zelfstandig aan de slag met de opensource FHIRconnect-specificaties en de openFHIR-engine.
Ik heb zelf gewerkt aan een mapping van OBSERVATION.blood_pressure.v2 (openEHR) naar nl-core-BloodPressure (FHIR R4). Hieronder laat ik zien hoe dat werkt.
De mapping maak je in een YAML-bestand. In de FHIRconnect-specificaties staan voorbeelden die je kunt hergebruiken. Of je kunt een voorbeeld zoeken in deze bibliotheek.
Stap 1: Context-mapping maken
In de context-mapping definieer je:
- De gebruikte FHIR-versie;
- Het FHIR-profiel waarop gemapt wordt;
- De bijhorende openEHR-template;
- De gebruikte archetypes.

Stap 2: Definieer je model-mapping
De model-mapping bestaat uit meerdere onderdelen.
De header koppelt het FHIR-profiel aan het openEHR-archetype, met versies en metadata. Het doel is versiebeheer en hergebruik van de mapping. Zie afbeelding 3.

Een preprocessor wordt gebruikt om aan te geven dat een mapping alleen toegepast moet worden als aan een bepaalde voorwaarde is voldaan. Bijvoorbeeld: voer de mapping alleen uit als Observation.code = 85354-9 (LOINC-code voor bloeddruk). Zie afbeelding 4.

De body vormt de kern van je mapping. In deze sectie definieer je de daadwerkelijke koppelingen tussen FHIR en openEHR. Hier geef je per dataelement aan welk element in FHIR correspondeert met welk element in openEHR. Dit gebeurt met behulp van FHIRPath en openEHR path.
Wat configureer je in de body?
Voor elk te mappen dataelement voeg je een apart blok toe met:
- name: een herkenbare naam voor de mappingregel;
- fhir: het pad naar het element in FHIR
Afbeelding 5 bevat een voorbeeldmapping voor de “meetmethode”. Het FHIRPath plak je achter “$resource” in het veld ‘fhir’.

- openehr: het corresponderende pad in openEHR;
Voor het openEHR path gebruik ik de Better Archetype designer (zie afbeelding 6). In het tabblad “Details” van je template staat het “Resolved path”. Knip het path na de naam van het archetype. In onderstaand voorbeeld is dit het path dat je nodig hebt: /protocol[at0011]/items[at1035]. Deze plak je vervolgens achter “$archetype” in je model-mapping.

- type: het datatype;
- conditions (optioneel): condities om te bepalen wanneer deze mapping wordt toegepast, zoals een fhirCondition (zie afbeelding 4);
- followedBy (optioneel): soms wil je dat een bepaalde mapping pas wordt uitgevoerd nadat een andere mapping klaar is, en daarvoor gebruik je followedBy. Je zegt hiermee: “Eerst dit mappen, dán pas dat andere veld”. In afbeelding 7 en 8 is dit toegepast voor het mappen van het FHIR-dataelement “systolische bloeddruk”, die valt onder “component”;


- manual (optioneel): gebruik dit als het mappen niet automatisch kan worden gedaan. Je geeft dan een vaste (handmatige) waarde op; dit is ideaal als een veld uit FHIR geen directe vertaling heeft in openEHR. In afbeelding 9 is een voorbeeld van een manual mapping weergegeven voor de “id”- en “meta”-dataelementen van de FHIR-resource.

Stap 3: Je mappings uploaden naar de openFHIR-engine
Gebruik een API-tool zoals Postman of Insomnia.
openEHR Operational Template (OPT) uploaden
- [POST] https://sandbox.open-fhir.com/opt


Context-mapping uploaden
- [POST] https://sandbox.open-fhir.com/fc/context

Model-mapping ploaden
- [POST] https://sandbox.open-fhir.com/fc/model

Stap 4: When the magic happens
Alles geconfigureerd en geüpload? Dan is het tijd voor het mooiste moment: de mapping in actie! Gebruik het volgende endpoint om je openEHR-data realtime om te zetten naar een FHIR-bericht:
- [POST] https://sandbox.open-fhir.com/openfhir/tofhir
Dit endpoint gebruikt de mapping-bestanden die je eerder hebt geüpload (OPT, context en model) en voert de mapping uit op basis van de FHIRconnect-specificaties.
… en voilà: je ontvangt automatisch een volledig FHIR-bericht van een bloeddrukmeting, netjes gegenereerd uit je openEHR-template.
{
"resourceType": "Bundle",
"entry": [
{
"resource": {
"resourceType": "Observation",
"id": "nl-core-BloodPressure-01",
"meta": {
"profile": [
"http://nictiz.nl/fhir/StructureDefinition/nl-core-BloodPressure"
]
},
"extension": [
{
"url": "http://hl7.org/fhir/StructureDefinition/observation-bodyPosition",
"valueCodeableConcept": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "33586001",
"display": "Zittende positie"
}
],
"text": "Zittende positie"
}
}
],
"status": "final",
"category": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/observation-category",
"code": "vital-signs",
"display": "Vital Signs"
}
]
}
],
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "85354-9",
"display": "Blood pressure panel with all children optional"
}
]
},
"effectiveDateTime": "2025-03-28T11:42:09+00:00",
"bodySite": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "368209003",
"display": "Structuur van rechter bovenarm"
}
],
"text": "Structuur van rechter bovenarm"
},
"method": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "371911009",
"display": "bloeddrukmeting met gebruikmaking van manchet"
}
],
"text": "bloeddrukmeting met gebruikmaking van manchet"
},
"component": [
{
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "8480-6",
"display": "Systolic blood pressure"
}
]
},
"valueQuantity": {
"value": 130,
"unit": "mm[Hg]"
}
},
{
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "8462-6",
"display": "Diastolic blood pressure"
}
]
},
"valueQuantity": {
"value": 85,
"unit": "mm[Hg]"
}
},
{
"code": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "6797001",
"display": "gemiddelde bloeddruk (waarneembare entiteit)"
}
]
},
"valueQuantity": {
"value": 135,
"unit": "mm[Hg]"
}
},
{
"code": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "70665002",
"display": "Blood pressure cuff"
}
]
},
"valueCodeableConcept": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "L",
"display": "Groot"
}
],
"text": "Groot"
}
},
{
"code": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "85549003",
"display": "Korotkofftonen (waarneembare entiteit)"
}
]
},
"valueCodeableConcept": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "255271000",
"display": "Phase V"
}
],
"text": "Phase V"
}
}
]
}
}
]
}
Governance: voorkom dubbel werk
Goede governance voorkomt dubbel werk en waarborgt kwaliteit. Gebruik centrale platforms voor het opslaan en delen van de mapping-bestanden, zoals Clinical Knowledge Manager (CKM) voor openEHR-modellen en Simplifier voor FHIR-profielen. Beheer mappings onder regie van organisaties als Nictiz om landelijke herbruikbaarheid te borgen.
De CKM ondersteunt nu al het uploaden van mappings.

De community beweegt mee
De introductie van de FHIRconnect-specificaties en de openFHIR-engine heeft tot veel positieve reacties geleid, ook op LinkedIn. Zorgprofessionals en techneuten zien in deze aanpak een concrete stap richting betere samenwerking tussen systemen.
Conclusie: één keer vastleggen, overal gebruiken
Met de FHIRconnect-specificaties koppel je openEHR en FHIR zonder telkens opnieuw het wiel uit te vinden, en op een manier die schaalbaar, betrouwbaar en herbruikbaar is.
Zelf aan de slag?
- Bekijk een voorbeeldmapping in de sandbox;
- Lees de FHIRconnect-specificaties;
- En start met je eerste mapping.
Wil je de volledige mapping-bestanden ontvangen? Of wil je sparren over jouw mapping? Klik op ‘maak kennis’ of neem contact op met Marc ([email protected])