eHealth Infrastructure - Local Development build (v2021.3.0). See the Directory of published versions
Defining URL: | http://ehealth.sundhed.dk/fhir/StructureDefinition/ehealth-observation |
Version: | 2021.3.0 |
Name: | ehealth-observation |
Status: | Active as of 2021-11-25T09:32:14+00:00 |
Publisher: | Systematic | Trifork |
Source Resource: | XML / JSON / Turtle |
The official URL for this profile is:
http://ehealth.sundhed.dk/fhir/StructureDefinition/ehealth-observation
An Observation contains the result of a measurement performed by the Patient. It is based on a ProcedureRequest that contains information about what to measure and when to measure.
In addition to the result and context, the Observation also contains information about the device used to perform the measurement and reference ranges copied from the ProcedureRequest. Reference ranges can change over time, so the copy ensures that the reference range at the time of measurement is preserved.
The eHealth Infrastructure will assist in calculating qualities of the measurement. The observation will be annotated with these qualities.
In the eHealth Infrastructure the Observation resource is used in conjunction with the following resources.
Observations can be submitted using the submit-measurement operation. It is possible to submit a bundle of related resources containing:
The submit-measurement operation is intended for uploading single measurements, not bulk uploads. Uploading large batches of resources is considered misuse.
The entire bundle is validated and then saved in a single transaction.
Observations are generally immutable once the bundle is saved. Further information about the observation can be added in separate resources like Provenance and Communication.
When a submitted Observation is actually reuse of a previous measurement, this must be marked by the submitter by added a Provenance resource with certain pre-defined properties.
Provenance
.target
must reference all reused resources in the submitted bundle; e.g. the Observation, QuestionnaireResponse or Media containing a copy of the reused values..activity
must have value “Quotation” (“wasQuotedFrom”) from FHIR ValueSet https://www.hl7.org/fhir/stu3/codesystem-w3c-provenance-activity-type.html#w3c-provenance-activity-type-Quotation.policy
must have value “http://ehealth.sundhed.dk/policy/ehealth/reuse-by-patient”.agent.whoReference
must reference the Patient who decided to reuse.entity.role
= “quotation”.entity.what
= must be reference to Observation, QuestionnaireResponse or Media being reused.The Provenance resource needs not be supplied for resources which are not being used. However, for non-reused resources, a Provenance resource with .activity
= “Primary-Source” can be used to indicate a newly obtained
(not reused) Observation, QuestionnaireResponse or Media.
When an Observation-bundle is submitted the eHealth Infrastructure will automatically create a Provenance resource, which identifies the resources which were submitted in the same bundle.
The search-measurements operation can return the resources submitted as part of the same bundle.
It is possible to search for Observations based on:
At least one of “subject” and “context” must be provided. “period” searches on range of “effective”.
See Searching for more information about searching in REST, messaging, and services.
Description of Profiles, Differentials, Snapshots and how the different presentations work.
Other representations of profile: CSV, Excel, Schematron
Path | Conformance | ValueSet |
Observation.language | preferred | CommonLanguages Max Binding: AllLanguages |
Observation.status | required | ObservationStatus |
Observation.category | preferred | ObservationCategoryCodes |
Observation.code | required | ObservationCodes |
Observation.dataAbsentReason | extensible | DataAbsentReason |
Observation.interpretation | extensible | ObservationInterpretationCodes |
Observation.bodySite | example | SNOMEDCTBodyStructures |
Observation.method | example | ObservationMethods |
Observation.referenceRange.type | required | ReferenceRangeType |
Observation.referenceRange.appliesTo | example | ObservationReferenceRangeAppliesToCodes |
Observation.component.code | required | ObservationCodes |
Observation.component.dataAbsentReason | extensible | DataAbsentReason |
Observation.component.interpretation | extensible | ObservationInterpretationCodes |
Id | Path | Details | Requirements |
dom-2 | Observation | If the resource is contained in another resource, it SHALL NOT contain nested Resources : contained.contained.empty() | |
dom-3 | Observation | If the resource is contained in another resource, it SHALL be referred to from elsewhere in the resource or SHALL refer to the containing resource : contained.where((('#'+id in (%resource.descendants().reference | %resource.descendants().as(canonical) | %resource.descendants().as(uri) | %resource.descendants().as(url))) or descendants().where(reference = '#').exists() or descendants().where(as(canonical) = '#').exists() or descendants().where(as(canonical) = '#').exists()).not()).trace('unmatched', id).empty() | |
dom-4 | Observation | If a resource is contained in another resource, it SHALL NOT have a meta.versionId or a meta.lastUpdated : contained.meta.versionId.empty() and contained.meta.lastUpdated.empty() | |
dom-5 | Observation | If a resource is contained in another resource, it SHALL NOT have a security label : contained.meta.security.empty() | |
dom-6 | Observation | A resource should have narrative for robust management : text.`div`.exists() | |
obs-6 | Observation | dataAbsentReason SHALL only be present if Observation.value[x] is not present : dataAbsentReason.empty() or value.empty() | |
obs-7 | Observation | If Observation.code is the same as an Observation.component.code then the value element associated with the code SHALL NOT be present : value.empty() or component.code.where(coding.intersect(%resource.code.coding).exists()).empty() | |
ele-1 | Observation.meta | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.implicitRules | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.language | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.text | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.extension | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ext-1 | Observation.extension | Must have either extensions or value[x], not both : extension.exists() != value.exists() | |
ele-1 | Observation.extension:episodeOfCare | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ext-1 | Observation.extension:episodeOfCare | Must have either extensions or value[x], not both : extension.exists() != value.exists() | |
ele-1 | Observation.extension:quality | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ext-1 | Observation.extension:quality | Must have either extensions or value[x], not both : extension.exists() != value.exists() | |
ele-1 | Observation.extension:resolvedTiming | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ext-1 | Observation.extension:resolvedTiming | Must have either extensions or value[x], not both : extension.exists() != value.exists() | |
ele-1 | Observation.modifierExtension | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ext-1 | Observation.modifierExtension | Must have either extensions or value[x], not both : extension.exists() != value.exists() | |
ele-1 | Observation.identifier | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.basedOn | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.partOf | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.status | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.category | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.code | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.subject | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.focus | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.encounter | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.effective[x] | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.issued | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.performer | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.value[x] | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.dataAbsentReason | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.interpretation | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.note | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.bodySite | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.method | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.specimen | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.device | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.referenceRange | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
obs-3 | Observation.referenceRange | Must have at least a low or a high or text : low.exists() or high.exists() or text.exists() | |
ele-1 | Observation.referenceRange.extension | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ext-1 | Observation.referenceRange.extension | Must have either extensions or value[x], not both : extension.exists() != value.exists() | |
ele-1 | Observation.referenceRange.modifierExtension | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ext-1 | Observation.referenceRange.modifierExtension | Must have either extensions or value[x], not both : extension.exists() != value.exists() | |
ele-1 | Observation.referenceRange.low | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.referenceRange.high | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.referenceRange.type | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.referenceRange.appliesTo | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.referenceRange.age | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.referenceRange.text | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.hasMember | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.derivedFrom | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.component | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.component.extension | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ext-1 | Observation.component.extension | Must have either extensions or value[x], not both : extension.exists() != value.exists() | |
ele-1 | Observation.component.modifierExtension | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ext-1 | Observation.component.modifierExtension | Must have either extensions or value[x], not both : extension.exists() != value.exists() | |
ele-1 | Observation.component.code | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.component.value[x] | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.component.dataAbsentReason | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.component.interpretation | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) | |
ele-1 | Observation.component.referenceRange | All FHIR elements must have a @value or children : hasValue() or (children().count() > id.count()) |