Personal Health Device Implementation Guide, published by HL7 International / Health Care Devices. This guide is not an authorized publication; it is the continuous build for version 2.0.0-ballot2 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/HL7/phd/ and changes regularly. See the Directory of published versions
Page standards status: Informative |
This chapter is for those whose use cases require measurement data from Personal Health Devices (PHD) and need that data in FHIR format. In most cases PHDs are used when the measurements are taken by individuals who are not medical professionals and outside of the health care provider's institution. The individuals could be patients recovering at home from a serious operation, diabetics managing their condition while trying to live as normal a life as possible, or athletes wearing fitness devices keeping track of their training. Point of Care Devices (PoCD) used in acute care are not covered by this IG. There is a separate implementation guide here for such devices.
It is important to understand that this Implementation Guide (IG) assumes that the source of the data is from communicating PHDs. This IG does NOT cover measurement data entered manually, such as a pulse rate taken by putting one's fingers on the wrist, or reading data from a non-communicating medical device.
PHGs following this IG use the following FHIR resources: Patient, Device, DeviceMetric and Observation. A Device resource is used for the PHG properties and a second Device resource is used for the PHD properties. Observation resources are used for each measurement and for the Coincident Timestamp Observation.
Understanding the content of the FHIR resources specified in this IG should be straight forward. Familiarity with the MDC coding system is the only IEEE 11073 domain-specific knowledge required. In addition, there are a few extensions used in the PHD-related profiles. One supports a reference to the Personal Health Gateway (PHG) Device resource in the PHD Observation profiles. A PHG is the unit that is typically responsible for communicating with the PHD and encoding that data into FHIR. It may be a mobile phone, a PC, or a dedicated set-top box. Another supports linking the timelines of the PHG and the PHD via a Coincident Timestamp Observation.
The next sections discuss the resources generated by PHGs following this IG.
PHDs measurements are encoded into Observation resources. There are different types of measurement values that can be reported by PHDs. Each measurement value type has its own profile but the profiles differ only in the way the value of the measurement is reported in the Observation resource. The supported measurement value types are:
Observation.component.value[x]
element).Every PHD generated measurement Observation resource contains the following information regardless of the measurement value type:
IEEE 11073-10206 Observation attribute | FHIR Observation data element | Description |
---|---|---|
type | code |
This element tells you what the measurement is. There should be a coding element using the MDC coding system. If a vital sign, there will be an additional coding element using one of the LOINC vital sign codes. |
category |
The category element is present with at least the value "phd" . For vital signs, there will also be another element with value "vital-signs" as required by the vital signs profile. |
|
measurement-status | Observation.status ,Observation.dataAbsentReason |
This element tells what the status of the measurements is and has usually the value final . In error cases the dataAbsentReason element is filled with an appropriate value. |
timestamp | Observation.effectiveDateTime ,Observation.effectivePeriod |
This element tells when the measurement occurred, and is a point in time or a period with a start- and end-time. |
PHG reference | Observation.extension.valueReference |
This element points to the PHG Device that generated the FHIR Observation. The gateway extension is identified by Observation.extension.url="http://hl7.org/fhir/StructureDefinition/observation-gatewayDevice" |
patient reference | Observation.subject |
Points to the Patient to whom this measurement refers |
PHD reference | Observation.device |
Points to the PHD Device that took the measurement |
In this section each of the fields summarized above is discussed.
Observation.code.coding.code
The measurement type tells what the measurement is. In HL7 such information is typically done through codes and it is no different here. However, one must understand the coding system in order to interpret what the code means. Consumers of the PHD profiles must understand the MDC code system to interpret the measurement. One can find more information about the MDC code system here.
MDC codes are available from the Rosetta Terminology Mapping Management Service (RTMMS). It provides descriptions and, if applicable, the units associated with the measurement in both MDC and UCUM. Equivalent LOINC codes are also provided. The Rosetta system is updated on a regular basis with new codes and corrections.
For those consumer applications that would like to have the codes as LOINC and the uploader did not provide them, a mapping table between MDC and LOINC is also included in LOINC since v2.54 available here. The FHIR MDC to LOINC concept map is available here. One may freely download and use this material as needed in an implementation, but it does require a (free) login account. A mapping from MDC to SNOMED CT for some of the more common codes is available in the somewhat outdated Continua Design Guidelines H.813 HIS Interface document. The guidelines are freely available for download, however licensing requirements for the use of the SNOMED CT code system apply.
FHIR requires that a LOINC code is present if the measurement is one of the vital signs given here. In that case, the Observation.code
shall have at least a second coding element containing a LOINC code. The consumer must be aware that the MDC-to-LOINC mapping may be many to one. For example, both the pulse rate obtained from a Blood Pressure Cuff (149546) and the pulse rate obtained from a Pulse Oximeter (149530) may be mapped to the LOINC code (8867-4). A PHG may map these MDC codes also to more specific LOINC codes.
In addition to the LOINC code, FHIR requires an Observation.category
element with value "vital-signs" when the measurement is a vital sign.
In normal situations PHD reported Observation resources have a Observation.status
element set to "final". However, every real device is going to experience challenges at some time. These challenges can interfere with the measurement and therefore need to be reported. One could argue that measurements with errors should not be delivered, but in a scenario where the PHG might be headless and one is happy that the patient can even take the measurement, it may be important to know that the measurement attempt was made. Therefore this IG supports a PHG to report any measurement it receives from a PHD including error states and let downstream consumers address it.
There are other non-error special conditions that may also be reported, such as the measurement is test or demo data.
Depending upon what the special condition is, it is reported in either the dataAbsentReason
, interpretation, or meta.security
element. All of these entries are CodeableConcepts. When the condition is reported in the dataAbsentReason
, there will be no measurement value entry in accord with the FHIR specification, even if the PHD reports a measurement value. Note that there may be multiple interpretation entries but only one dataAbsentReason
element.
The exact mapping of IEEE 11073-10206 Observation status conditions to FHIR is covered in the PhdBaseObservation profile.
In addition to the conditions listed above, when the measurement value is a quantity, PHDs may also report one of a set of special FLOAT values, "Not a Number", "Not at this resolution", "Positive infinity", or "Negative infinity". These errors can results from a failure of the floating point software or hardware, or the inability of the sensor to completely acquire a value. These errors are reported in the dataAbsentReason
element and will be discussed in the sections discussing the measurement values. "Not a Number" is the most common special condition reported by PHDs currently on the market. Reporting of the other special situations listed above are, in practice, rare.
Observation.effective[x]
All measurements contain a time stamp which is either an instant in time (a dateTime
data type), or a period of time (a Period
data type). A period reported by a PHD has both a start and an end. Results of a workout session are a common type of measurement with a period. The dateTime
data type is chosen as it is permissible for PHDs to report time at resolutions greater than a day in which case there is no time zone. An activity monitor reporting only daily summaries could be an example of a PHD using such a time resolution.
All timestamps with resolutions finer than a day contain the offset to UTC. If the offset is -00:00, it means that the offset to local time is not known, and what is being reported is UTC time, even though the measurement is taken in Japan. If the offset is +00:00, it means the offset IS known; the measurement just happens to be in a time zone that is UTC.
Below is an example of the effective[x]
when the timestamp is an instant in time:
{
"resourceType" : "Observation",
...
"effectiveDateTime" : "2025-01-08T19:07:48-05:00",
...
}
The reference to the Device resource containing the PHG properties is encoded in an extension element. An example of the PHG extension is shown below:
{
"resourceType" : "Observation",
...
"extension" : [
{
"url" : "http://hl7.org/fhir/StructureDefinition/observation-gatewayDevice",
"valueReference" : {
🔗 "reference" : "Device/phg-ecde3d4e58532d31.000000000000"
}
},
...
]
}
Observation.subject
:The reference to the Patient resource containing information about the patient upon whom the measurement was taken is placed in the Observation.subject
element.
In many cases the patient is also the person that is taking the measurement. In other cases a general physician may be using a PHD in his clinic. When known to the gateway a reference to the performer may be present in an Observation.performer
element.
The reference to the PHD device is placed in the Observation.device
element.
There is a dedicated profile for the PHD device that is used to capture the system information, clock and power information that the PHG receives from the PHD.
In addition to the elements that are always present, the following set of elements may be present.
IEEE 11073-10206 attribute | FHIR data element | Description |
---|---|---|
Observation class | Observation.profile |
When present this element contains canonical URL of structure definitions of the profiles this Observation conforms to. |
clock.current-time | Observation.extension.valueReference |
Can be retrieved via the CoincidentTimeStamp reference extension that points to a Coincident Timestamp Observation that records the PHD's current time. This is used for time quality auditing purposes. |
related observations | Observation.derivedFrom Observation.hasMember |
Points to a PHD Observation that is related to this Observation. An example would be an activity session that has a miles run measurement member. Only present if the observation references another observation. |
additional descriptions | Observation.component or Observation.extension |
Sometimes a measurement is sent containing additional information such as the technique used to obtain the measurement. These elements are placed in a component or an extension. |
Observation.identifier |
A unique identifier can be generated and used by a PHG and to prevent data duplication during uploads. |
Observation.meta.profile
An Observation may contain a meta.profile
element that can help to identify the type of the Observation. For example, if Observation.profile
entry contains "http://hl7.org/fhir/uv/phd/StructureDefinition/PhdNumericObservation" the measurement is a scalar.
Note that there is no requirement that the profile
element be present. If it is not present, the consumer can determine the type of measurement value by looking at the Observation.value[x]
element.
When present, the consumer can obtain further information about the timestamp from a referenced coincident timestamp Observation that adheres to the PhdCoincidentTimeStampObservation profile. This reference may be present in the CoincidentTimeStampReference extension. If the reference is NOT present, it means that the PHD did not provide a timestamp and the PHG used the time of reception as the timestamp or that the PHG determined that the PHD timestamp is reliable and can be used as is. PHDs that send stored data shall include timestamps in their measurements.
The Coincident Timestamp Observation can be used to determine the PHD's timeline and clock status. It can also be used to see if the PHG needed to correct the timestamp, and if it did, by how much. An example of the Coincident Timestamp extension is shown below:
{
"resourceType" : "Observation",
...
"extension" : [
...
{
"url" : "http://hl7.org/fhir/uv/phd/StructureDefinition/CoincidentTimeStampReference",
"valueReference" : {
🔗 "reference" : "Observation/coin-20181119174911"
}
},
...
]
}
There are situations where a given Observation is derived from or part of another Observation such as a BMI observation being derived from a height and weight measurement. In that case the Observation will have Observation.derivedFrom
elements that point to the Observation resources containing the height and weight measurement. Another common case where an Observation references another Observation is in an activity monitor. Results of an exercise session such as miles run, calories burned, average and maximum heart rates, etc. are reported as Observations where each Observation is referenced from the master session Observation in an Observation.hasMember
element.
An example of a reference to another Observation is shown below:
{
"resourceType" : "Observation",
...
"derivedFrom" : [
{
🔗 "reference" : "Observation/compound-numeric-blood-pressure"
}
],
...
}
In this section we further define Observation details that a PHD may provide but are uncommon. The reader may wish to skip to to the description of the measurement values sections here and return to this section when relevant.
PHDs can send measurements that have additional descriptive information. An example would be a pulse oximeter indicating the modality used when taking the measurement. Some of the additional information reported can only occur if the measurement value is a of a specific value type such as a quantity. This additional information is reported in an Observation.component
or an Observation.extension
element. The type of additional information is given by the Observation.component.code
or Observation.extension.url
element. The value of such additional information is given by an Observation.component.value[x]
or an Observation.extension.value[x]
element. PHDs support the following types of additional information:
Type of additional information | When it can occur | FHIR data element | Description |
---|---|---|---|
supplemental type | Can occur with all measurement values | valueCodeableConcept |
provides a further description of the measurement type. Can be multiple supplemental type component entries. |
Accuracy | Only with Quantities | (Accuracy) extension.valueQuantity |
Gives the accuracy of the measurement value in the units of the measurement value |
Measurement Confidence 95 | Only with Quantities | (Confidence95) extension.valueRange |
Gives a range that the manufacturer is 95% confident that the actual reported measurement is within that bounds |
Simple Alerting | Only with Quantities | (SimpleAlerting) extension.* |
Gives the parameters for alerting and thresholding on a quantity. |
More details on the extensions that can be used with quantities can be found in the PhdNumericObservation profile.
Supplemental type information is indicated by the Observation.component.code
element having the value 68193. The value type of a supplemental type entry is always a CodeableConcept and is therefore given by Observation.component.valueCodeableConcept.coding.code
. There may be more than one Observation.component
entry containing supplemental type information. An example of a supplemental types component entry is as follows:
{
"resourceType" : "Observation",
...
"component" : [
{
"code" : {
"coding" : [
{
"system" : "urn:iso:std:iso:11073:10101",
"code" : "68193",
"display" : "MDC_ATTR_SUPPLEMENTAL_TYPES"
}
]
},
"valueCodeableConcept" : {
"coding" : [
{
"system" : "urn:iso:std:iso:11073:10101",
"code" : "150588",
"display" : "MDC_MODALITY_SPOT"
}
]
}
}
]
}
A 'spot modality' means that the pulse oximeter sensed over a period long enough to obtain a stable average.
Should we move Supplemental Type information to an extension? In the PHD IG v1.0 an attempt was made to avoid extensions as much as possible. In this version we are using extensions for less-often used elements of the IEEE 11073 PHD ACOM model and in places were the PHD model and the FHIR model for observation are too different to have a 1-1 mapping between data elements of these models. The question is if this applies to Supplemental Type information as well. - Is it appropriate to map IEEE supplemental information to `observation.component` as a generic and pragmatic solution? - Moving forward, should IEEE 11073-10206/20601 Supplemental Information be modeled as a FHIR `Observation.component` or as an extension in FHIR? Input is welcome!
To prevent data duplication during uploads, and enable use of conditional create transactions, identifiers are provided for the Observations described in this IG. No additional meaning is associated with those identifiers. Details can be found in the Identifier section. Other systems may add further identifiers.
Scalar numeric measurements are the most common type of measurement reported by PHDs. Temperature, weight, height, miles run, pulse rate, etc. are examples. Scalar numeric measurements are reported in Observation resources following the Phd Numeric Observation Profile. The scalar values are reported in the Observation.valueQuantity
element.
Normally the Observation.valueQuantity
is populated with the scalar value, the units, and the system. The units and system are UCUM unless the PHG does not know the UCUM translation for the MDC unit code. The latter can happen if a new specialization, written after the PHG was implemented, introduces a new MDC unit code not previously used in PHDs. The scalar value is reported with the precision indicated by the PHD. Thus 2 and 2.00 represent the same value but measured to a different precision.
If the PHD reports a special FLOAT value an Observation.dataAbsentReason
element replaces the valueQuantity and there is no value[x] element.
FHIR element | Description |
---|---|
Observation.valueQuantity.value |
Measurement value: It will have the precision reported by the PHD, thus the numerical value 2 could be reported as 2, 2.0, or 2.00 depending upon the sensor precision |
Observation.valueQuantity.code |
units in UCUM |
Observation.valueQuantity.system="http://unitsofmeasure.org" |
code system is UCUM |
If a special FLOAT value is reported an Observation.dataAbsentReason
then this replaces the valueQuantity. The dataAbsentReason
is a CodeableConcept and will have the following possible codes from the data absent reason coding system "http://terminology.hl7.org/CodeSystem/data-absent-reason":
Observation.dataAbsentReason.coding.code="not-a-number"
Observation.dataAbsentReason.coding.code="positive-infinity"
Observation.dataAbsentReason.coding.code="negative-infinity"
Observation.dataAbsentReason.coding.code="error"
The Observation.system
in the above cases is always
Observation.dataAbsentReason.coding.system="http://terminology.hl7.org/CodeSystem/data-absent-reason"
An example of the valueQuantity in the Phd Numeric Observation Profile for a thermometer reporting a value in °C is as follows:
{
"resourceType" : "Observation",
...
"valueQuantity" : {
"value" : 36.5,
"unit" : "C",
"system" : "http://unitsofmeasure.org",
"code" : "Cel"
},
...
}
IEEE 11073-10206 (ACOM) supports compound observations where the components can have a numeric, a string, a code or a sample array value. This type of observation is mapped to the Phd Compound Observation profile.
There is no primary Observation.value[x]
entry and there is no Observation.dataAbsentReason
unless the entire measurement had an error, in which case there will be no compound entries either. It is possible for each compound entry to have its own error and that will be reported in an Observation.component.dataAbsentReason
element. All Observation.component
entries could have dataAbsentReason
entry but that does NOT mean the entire measurement has an Observation.dataAbsentReason
entry. It is also possible that a component will have its own interpretation element of the same type as shown in the Measurement Status section. Currently there are no market PHDs that generate an Observation.component.interpretation
element.
Compound Observations will have a code indicating what the 'entire' measurement is, for example, non-invasive blood pressure or acceleration. Each Observation.component
element will have its own code describing each individual compound or vector entry, for example, the systolic, diastolic, and mean pressures for the blood pressure or x-, y-, and z-projections of an acceleration.
Each Observation.component
will have the following:
FHIR element | Description |
---|---|
Observation.component.code.coding.code |
MDC code telling what the entry is |
Observation.component.code.coding.system="urn:iso:std:iso:11073:10101" |
MDC code system identifier |
Observation.component.value[x] |
contains the value of the component being a Quantity, CodeableConcept, string or SampledData |
IEEE 11073-20601 does only support compound measurements with numeric components. These observations adhere to the Phd Compound Numeric Observation Profile ("http://hl7.org/fhir/uv/phd/StructureDefinition/PhdCompoundNumericObservation"). For the numeric components the following applies:
FHIR element | Description |
---|---|
Observation.component.valueQuantity.value |
the scalar value of the given entry with the precision indicated by the PHD |
Observation.component.valueQuantity.code |
the units (as UCUM) |
Observation.component.valueQuantity.system="http://unitsofmeasure.org" |
UCUM code system identifier |
Note that the Observation.component.code
element is subject to the same FHIR LOINC code requirement as the Observation.code
element if the component is one of the vital signs here. The Systolic and Diastolic pressures are in that list, but the MEAN component is not.
See the blood pressure observation example for details on Observation.code
, Observation.category
, and Observation.component
entries.
The Phd Compound Numeric Profile can contain additional entries as noted in the Additional Descriptive Data section above. However, the codes of all Observation.component
entries that are part of a compound measurement will always have an MDC code and not a code from the ASN1ToHL7 code system.
The decision to report a compound observation versus independent observations is made by the designers of the IEEE PHD device specialization standards. The IEEE PHD and FHIR policies to choose between these options are similar. This IG maps an ACOM compound observation to a FHIR Observation resource with multiple components.
Sometimes the PHD measurement value is a code. The code comes from the MDC code system. Measurements that are codes follow the Phd Coded Enumeration Observation profile.
The measurement value is reported in an Observation.valueCodeableConcept
element. Coded measurements are usually 'context' measurements that provide extra information about another measurement. They will often have an Observation.derivedFrom
reference pointing to the Observation resource they support. There are no coded enumeration measurements that are vital signs.
An example of a coded measurement is a meal context in a glucose monitor:
{
"resourceType" : "Observation",
...
"valueCodeableConcept" : {
"coding" : [
{
"system" : "urn:iso:std:iso:11073:10101",
"code" : "8417872",
"display" : "MDC_CTXT_GLU_MEAL_POSTPRANDIAL"
}
],
"text" : "After lunch/dinner"
},
...
}
This measurement indicates that the glucose concentration measurement was taken after a meal.
PHDs support a measurement value type that indicate a set of states or events, for example, an independent living monitor may be surveilling an elderly patient's room and report its current state 'door closed', 'window closed', 'climate control on', 'patient in room', and 'lights off'. The report may have been triggered by an event like 'patient entered room'. (There is no such measurement type as a current room state but it illustrates the concept.) PHDs have an efficient way to package such reports into a single integer. This type of reporting is done when more than one state and/or event can occur simultaneously. In order to understand such a report one has to know what the state or event is, and its value. States and events are binary. A state is either on or off and an event either happens or it doesn't. There is no corresponding HL7 data type for this kind of measurement thus the ASN1ToHL7 code system has been developed to express these states and events as codes. A Boolean is used to express the corresponding values.
Measurement values of this type are mapped to an Observation following the Phd Bits Enumeration Observation profile.
Each event or state is reported in a component element. The Observation.component.code
will be the ASN1ToHL7 code indicating what the state or event is. The value of the state or event will be a Boolean value. It should be noted that 'state' values must be reported for either state. It is as important to know whether the door is opened or closed. Events are only required to be reported when they happen.
Implementers should not make any assumption about the state assignment. For example, to assume that 'something opened' is signified by a true
can lead to misinterpretation. The monitor specification may have been designed with the idea that everything closed was the desired state and signified it with true
. The ASN1ToHL7 code system will have the assignment and readers will need to examine it.
PHD can indicate that is does not support certain state or event flags in a given measurement report. This situation is expressed by replacing the Observation.component.valueCodeableConcept
element with an Observation.component.dataAbsentReason
element with reason "unsupported". Currently there are no market PHDs that support this feature.
Observations following the Phd Bits Enumeration Observation profile have no primary Observation.value[x]
entry and there is no Observation.dataAbsentReason
unless the entire measurement has an error, in which case there will be no state or event entries either. It is possible for each state or event entry to be unsupported and that will be reported with a Observation.dataAbsentReason
element. Even if every Observation.component
entry reports 'unsupported' that does not have the same meaning as the entire measurement being in error.
In structure these Observations are similar to compound Observations. It is also possible that 'additional descriptions' as discussed in the Additional Descriptive Data section are present.
Each Observation.component
entry will have the following:
FHIR element | Description |
---|---|
Observation.component.code.coding.code |
ASN1ToHL7 code telling what the entry is |
Observation.component.code.coding.system="http://terminology.hl7.org/CodeSystem/ASN1ToHL7" |
ASN1ToHL7 code system identifier |
Observation.component.valueBoolean |
contains the value of the state or event being true or false |
The 'independent living' example mentioned above does not currently exist in any specialization but it is illustrative of the concept. However, a pulse oximeter device sensor status measurement containing several different events does exist. An example of such a measurement can be found here
All of the entries are events in this example so the values are always true
indicating the event occurred. One might note that the ANS1ToHL7 code 150604.x in all cases contains the MDC code of the measurement 150604. That relationship will always be true for all event and state measurement value types.
Periodic measurements are typically waveforms like ECG traces and are a sequence of scalars. Measurement values that fall into this category are mapped to an Observation following the Phd Rtsa Observation profile. 'Rtsa' means real time sample array.
Periodic measurements are reported in Observation.valueSampledData
data elements as follows:
FHIR element | Description |
---|---|
Observation.valueSampledData.data[i] |
Contains the scaled samples separated by spaces |
Observation.valueSampledData.origin.code Observation.valueSampledData.origin.system |
Contains the units (as UCUM code) "http://unitsofmeasure.org" |
Observation.valueSampledData.origin.value |
Contains the intercept value in the rescaling equation |
Observation.valueSampledData.scaleFactor |
Contains the scale factor in the rescaling equation |
Observation.valueSampledData.period |
gives the time interval between samples in milliseconds |
Observation.valueSampledData.dimensions |
Always 1 in PHD (multi-dimensional arrays are not supported) |
Observation.valueSampledData.upperLimit |
Scaled upper value that the sequence can obtain |
Observation.valueSampledData.lowerLimit |
Scaled lower value that the sequence can obtain |
To obtain the original values of the measured sequence one uses the following equation:
original_value[i] = valueSampledData.scaleFactor * valueSampledData.data[i] + valueSampledData.origin.value
or the familiar equation of a line
y(i) = mx(i) + b
The upperLimit
and lowerLimit
elements are for convenience and are not necessary for decoding the data. They can be used when plotting the data as they give the upper and lower bounds of the trace at any time. One can create a graph with these limits without examining the sequence.
It is possible that the periodic measurement is a vital sign, for example, a heart rate. If it is a vital sign, the same FHIR-required LOINC code requirements apply as they do for scalar and vector measurements.
PHDs can send a measurement value that is a human readable string. An example of such a measurement might be the name of a customized exercise program on a piece of gym equipment. String measurement values are mapped to an Observation following the PhdStringObservation profile. The string is reported in an Observation.valueString
element.
An example of this measurement is as follows:
{
"resourceType" : "Observation",
...
"valueString" : "Test Strip Buckled",
...
}
The coincident timestamp is a comparison of the PHD's and PHG's timelines. PHDs have limited resources and are often battery driven and may depend upon the user or the PHG to set its time, though it is possible for PHDs to support an external time synchronization method. The timelines of PHDs can therefore be dubious. PHGs are required to support external time synchronization and if possible, to obtain the local offset to UTC.
In the PHD-PHG exchange, the PHG retrieves the PHD's current time, time synchronization state, and accuracy. At the time of the query the PHG also records its current time. The PHG compares the two timelines, the two states of synchronization, and the two states of synchronization accuracy as far as available. If the PHG is better synchronized, the PHG will correct the PHD reported times by the difference between the two timelines. The PHG may also set the PHD's time if the PHD supports it and when needed, bringing the two timelines into synchrony.
If the PHD is better synchronized than the PHG, the PHG reports the PHD's times unaltered.
The coincident timestamp also indicates whether there is a time fault. In the case of relative times, the coincident timestamp provides the 'anchor' that allows the PHG to create wall clock times from the PHD's 'tick' values. PHDs use tick counters or relative time as they are much simpler to implement than a civil-time or UTC clock that needs to track day, month and year boundaries and possibly needs to handle DST adjustments.
The following core information is available from the coincident timestamp observation:
FHIR element | Description |
---|---|
Observation.code.coding.code |
MDC code that indicates what type of time clock is used by PHD. It is one of: - absolute time (local time with no offset to UTC) - base offset time (local time with offset to UTC) - relative time (a tick count) |
Observation.effectiveDateTime |
the PHG's current time - absent if the PHD is better synchronized than the PHG |
Observation.valueDateTime Observation.valueQuantity Observation.dateAbsentReason.coding.code="unknown" |
- the PHD's current time if base offset or absolute time - the PHD's current time if a relative time - the PHD has a time fault |
If the Observation containing the measurement has no reference to a coincident timestamp, it means the PHD provided no measurement timestamp and the PHG used the time of reception as the current timestamp.
The coincident timestamp follows the Phd Coincident Timestamp Observation Profile.
The information provided by this Observation is mostly for auditing, but readers could check whether or not there is a time fault.
The PHD Device resource follows the Phd Device Profile.
The PHD Device resource contains the following information about the PHD in the following elements:
Device.identifier
Device.udiCarrier
Device.manufacturer
Device.modelNumber
Device.serialNumber
Device.partNumber
Device.type
Device.version
Device.specialization
Device.property
The bold items are required to be reported by all PHDs and the italicized items are exposed by most PHDs. The transport addresses are only exposed in the transport protocol and are, of course, only applicable to PHDs using that transport. It is encouraged by the PHG implementer to add the wireless transport address identifiers since these numbers are often available on the device whereas the system id is not. However, obtaining these addresses may not always be possible on certain platforms.
The identifier contains elements that (are intended to) uniquely identify the PHD. To distinguish one identifier type from another a code from the ContinuaDeviceIdentifiers code system is used in the Device.identifier.type. Supported codes include the IEEE EUI-64 System Identifier and transport-based identifiers. See the CodeSystem-ContinuaDeviceIdentifiers for the complete list of codes. These identifiers are formatted as hexadecimal strings with each pair of characters separated by dashes and using capitals.
An example is shown below:
{
"resourceType" : "Device",
...
"identifier" : [
{
"type" : {
"coding" : [
{
"system" : "http://terminology.hl7.org/CodeSystem/ContinuaDeviceIdentifiers",
"code" : "SYSID",
"display" : "IEEE 11073 System Identifier"
}
]
},
"system" : "urn:oid:1.2.840.10004.1.1.1.0.0.1.0.0.1.2680",
"value" : "74-E8-FF-FE-FF-05-1C-00"
},
{
"type" : {
"coding" : [
{
"system" : "http://terminology.hl7.org/CodeSystem/ContinuaDeviceIdentifiers",
"code" : "BTMAC",
"display" : "Bluetooth MAC address"
}
]
},
"system" : "http://hl7.org/fhir/sid/eui-48/bluetooth",
"value" : "00-1C-05-FF-E8-74"
}
],
...
}
The UDI (Unique Device Identifier) is supported by the PHD Device profile as an optional element. It is supported by the IEEE 11073-10206 standard and the Bluetooth GHS specifications. When provided by the PHD the actual UDI string will be in human readable form and comes with metadata identifying the issuer and the regulatory authority
There are several Device elements that are just basic strings. Their meanings are straight forward. In the Phd Device profile they are the following:
Device.manufacturer
Device.modelNumber
Device.serialNumber
Device.partNumber
This field states that the device is a PHD. There is no code in the list of device types provided by FHIR here that indicates a personal health device. Instead we use the MDC code that indicates a simple MDS (Medical Device System) object. This entry will be identical for all PHDs following this IG. It appears as follows:
{
"resourceType" : "Device",
...
"type" : {
"coding" : [
{
"system" : "urn:iso:std:iso:11073:10101",
"code" : "65573",
"display" : "MDC_MOC_VMS_MDS_SIMP"
}
],
"text" : "Simple PHD"
},
...
}
The Device.versions
entry is an array of CodeableConcepts. A single version is unable to represent a PHD as they have a version for the sensor hardware, the internal protocol they may be using, the communication software, sensor firmware, etc. the PHD supports. Not all devices will expose all this information but most PHDs expose their firmware and software versions.
The MDC Device Version Type codes ValueSet has a code to identify each one of these version types. The version itself it just a simple alpha-numeric string. The versions can be helpful identifying different PHD behaviors.
Below is an example of the different versions exposed by a PHD:
{
"resourceType" : "Device",
...
"version" : [
{
"type" : {
"coding" : [
{
"system" : "urn:iso:std:iso:11073:10101",
"code" : "531976",
"display" : "MDC_ID_PROD_SPEC_FW"
}
],
"text" : "Firmware revision"
},
"value" : "r2.1"
},
{
"type" : {
"coding" : [
{
"system" : "urn:iso:std:iso:11073:10101",
"code" : "531975",
"display" : "MDC_ID_PROD_SPEC_SW"
}
],
"text" : "Software revision"
},
"value" : "r1.5 9.7"
},
{
"type" : {
"coding" : [
{
"system" : "urn:iso:std:iso:11073:10101",
"code" : "531974",
"display" : "MDC_ID_PROD_SPEC_HW"
}
],
"text" : "Hardware revision"
},
"value" : "r1.0"
},
{
"type" : {
"coding" : [
{
"system" : "urn:iso:std:iso:11073:10101",
"code" : "532352",
"display" : "MDC_REG_CERT_DATA_CONTINUA_VERSION"
}
],
"text" : "Continua version"
},
"value" : "6.0"
}
],
...
}
The Device.specialization
entry is probably the entry most consumers will want to inspect. This entry states what kind of measurements the PHD takes. It is this entry that tells the consumer if the PHD is a blood pressure cuff, heart rate monitor, pulse oximeter. PHDs can support multiple specializations. This element shall always be populated.
In IEEE 11073-10206 ACOM specializations are, in addition to a general description of what the PHD is, standards. The specialization standards are a refinement of the generic standard, and have versions.
A table of some of the most common specializations can be found in the specialization section here.
The example below shows an example of a PHD following the Glucose specialization:
{
"resourceType" : "Device",
...
"specialization" : [
{
"systemType" : {
"coding" : [
{
"system" : "urn:iso:std:iso:11073:10101",
"code" : "528401",
"display" : "MDC_DEV_SPEC_PROFILE_GLUCOSE"
}
],
"text" : "Glucose Monitor"
},
"version" : "1"
}
],
...
}
property
elements contain time clock information and certification information. There will be at least one property
entry for every PHD and that reports the time synchronization information. The entry will be present even if the PHD supports no time clock, and in that case the value will be 'no time synchronization'.
There are two types of properties, one that is described by a list of codes, and one that is described by a list of quantities. The list often contains only one entry. Though not obvious from the FHIR 4.0.1 specification, a property
cannot contain both a quantity and coded element.
The property.type
is a CodeableConcept which tells what the property is. There are MDC or ASN1ToHL7 codes for each property type a PHD can expose. They are as follows:
description | Code | Reference identifier |
---|---|---|
Time Synchronization | 68220 | MDC_TIME_SYNC_PROTOCOL |
Time capabilities | 68219.x | ASN1ToHL7 name |
High resolution relative time resolution | 68224 | MDC_TIME_RES_REL_HI_RES |
Relative time resolution | 68223 | MDC_TIME_RES_REL |
Absolute Time time resolution | 68222 | MDC_TIME_RES_ABS |
Base offset time resolution | 68226 | MDC_TIME_RES_BO |
RR-interval Ticks. This clock is NOT used for timestamps. | 68229 | MDC_ATTR_TICK_RES |
Time synchronization accuracy | 68221 | MDC_TIME_SYNC_ACCURACY |
Regulation status | 532354.x | ASN1ToHL7 name |
Continua Certified Device List | 532353 | MDC_REG_CERT_DATA_CONTINUA_CERT_DEV_LIST |
There will always be a time synchronization entry. It is identified by a property.type.coding.code="68220"
. It indicates the method the PHD uses to externally synchronize to a time reference. The value is a single valueCode entry. MDC codes express the possible synchronization methods. A table of the possible codes can be found in the time synchronization section here. This value is TIME_SYNC_NONE (532224) if the PHD does not support a synchronization protocol or has no time clock at all.
The time capabilities defines the types of real time clocks supported, whether the time can be set, whether external time synchronization is possible, etc. Each capability is treated as an event, so most PHGs will only report the capability if the PHD indicates it has the capability. The value is a single valueCode which will be either "Y" if the PHD has the capability or "N" if not. Most PHGs will not report the "N" case as that would significantly increase the size of the resource on the wire. There may be several such time capability property entries.
The time capabilities property is indicated by the property.type.code
having one of the ASN1ToHL7 codes of "68219.x" which is NOT a decimal number! The value is a valueCode with codes "Y" or "N".
The time clock resolutions is given by one of four MDC codes for each of the possible types of time clocks. Note that a PHD can only simultaneously support an absolute time (wall clock time with no offset) or base offset time (wall clock time with offset). A PHD may support both relative time clocks thus there could be up to three separate time resolution property entries though in most cases there is only one clock.
The resolution value is a valueQuantity and it gives the time interval between clock 'pulses', regardless of the type of time clock, in units of microseconds.
The property is indicated by the property.type.code
having one of four MDC codes "68222, 68223, 68224, and 68226". The value is a valueQuantity.
This section is only relevant for PHDs that support the Heart Rate or ECG specializations based on IEEE 11073-20601. It is not used for measurement timestamps but for measuring R-R intervals (time between electrocardiogram R-wave peaks) in ECG and Heart Rate specializations. The time tick resolution is a high frequency clock that is used to measure the time between R-wave peaks in an ECG trace.
The number of ticks is reported in the valueQuantity.value
element in Observations, not the effective[x] which is the time the measurement is taken. These special clocks typically have a resolution of 1024 Hz or better. When R-R intervals are reported, they are reported in units of these ticks, so one must know what the frequency of the clock is. The reason for this special clock is that R-R intervals have been traditionally timed using dedicated crystal oscillators.
ACOM-based ECGs do not use the time tick resolution to report R-R intervals.
The Regulation status is a set of states where only one state is defined. Regulation Status is used to indicate which regulation body the PHD is regulated by. At the moment, the single defined state is assumed to be FDA. All market devices that currently report a regulated state are FDA regulated.
The property is indicated by the property.type.code
having the ASN1ToHL7 code "532354.x" where the only currently defined entry is x=0. The value is a valueCode which can have a value "Y" or "N". The twist here is that the state has been defined in the negative. Thus a code value of "N" means regulated. Note that since this is a state, the PHG is required to report both the "Y" and "N" values if the PHD reports a regulation status.
This property contains a code that indicates a specialization and transport the PHD has been (self-)certified for. Note there is a difference between 'support' and 'certified' support. The Device specialization entries indicate what the PHD supports. Certified means the PHD has been (independently) placed through a set of extensive tests for the specialization and the transport over which the specialization operates. In the past, the Continua organization certified PHDs for compliance to its guidelines that referenced this IG.
The property is indicated by the property.type.code
having the MDC code "532353". The value is a code from the ValueSet for PHD Interfaces code system.
The fragment below shows the set of properties of an example PHD. Note that the time synchronization protocol is "none" and the time resolution is "relative" with a resolution of 1 second. The PHD is regulated and has certified interfaces.
{
"resourceType" : "Device",
...
"property" : [
{
"type" : {
"coding" : [
{
"system" : "urn:iso:std:iso:11073:10101",
"code" : "532353",
"display" : "MDC_REG_CERT_DATA_CONTINUA_CERT_DEV_LIST"
}
],
"text" : "Each element of the certified interfaces list as a separate property"
},
"valueCode" : [
{
"coding" : [
{
"system" : "http://hl7.org/fhir/uv/phd/CodeSystem/ContinuaPHDInterfaceIDs",
"code" : "32772",
"display" : "Bluetooth LE Pulse Oximeter certified"
}
]
}
]
},
{
"type" : {
"coding" : [
{
"system" : "urn:iso:std:iso:11073:10101",
"code" : "532353",
"display" : "MDC_REG_CERT_DATA_CONTINUA_CERT_DEV_LIST"
}
],
"text" : "Each element of the certified interfaces list as a separate property"
},
"valueCode" : [
{
"coding" : [
{
"system" : "http://hl7.org/fhir/uv/phd/CodeSystem/ContinuaPHDInterfaceIDs",
"code" : "8196",
"display" : "PHDC USB Pulse Oximeter certified"
}
]
}
]
},
{
"type" : {
"coding" : [
{
"system" : "urn:iso:std:iso:11073:10101",
"code" : "532353",
"display" : "MDC_REG_CERT_DATA_CONTINUA_CERT_DEV_LIST"
}
],
"text" : "Each element of the certified interfaces list as a separate property"
},
"valueCode" : [
{
"coding" : [
{
"system" : "http://hl7.org/fhir/uv/phd/CodeSystem/ContinuaPHDInterfaceIDs",
"code" : "4",
"display" : "Pulse Oximeter certified"
}
]
}
]
},
{
"type" : {
"coding" : [
{
"system" : "http://terminology.hl7.org/CodeSystem/ASN1ToHL7",
"code" : "532354.0",
"display" : "negated-regulation-status"
}
]
},
"valueCode" : [
{
"coding" : [
{
"system" : "http://terminology.hl7.org/CodeSystem/v2-0136",
"code" : "N"
}
]
}
]
},
{
"type" : {
"coding" : [
{
"system" : "urn:iso:std:iso:11073:10101",
"code" : "68220",
"display" : "MDC_TIME_SYNC_PROTOCOL"
}
],
"text" : "Time synchronization protocol"
},
"valueCode" : [
{
"coding" : [
{
"system" : "urn:iso:std:iso:11073:10101",
"code" : "532224",
"display" : "MDC_TIME_SYNC_NONE"
}
]
}
]
},
{
"type" : {
"coding" : [
{
"system" : "http://terminology.hl7.org/CodeSystem/ASN1ToHL7",
"code" : "68219.0",
"display" : "mds-time-capab-real-time-clock"
}
]
},
"valueCode" : [
{
"coding" : [
{
"system" : "http://terminology.hl7.org/CodeSystem/v2-0136",
"code" : "Y"
}
],
"text" : "real time clock supported"
}
]
},
{
"type" : {
"coding" : [
{
"system" : "http://terminology.hl7.org/CodeSystem/ASN1ToHL7",
"code" : "68219.1",
"display" : "mds-time-capab-set-clock"
}
]
},
"valueCode" : [
{
"coding" : [
{
"system" : "http://terminology.hl7.org/CodeSystem/v2-0136",
"code" : "Y"
}
],
"text" : "setting the time supported"
}
]
},
{
"type" : {
"coding" : [
{
"system" : "http://terminology.hl7.org/CodeSystem/ASN1ToHL7",
"code" : "68219.2",
"display" : "mds-time-capab-relative-time"
}
]
},
"valueCode" : [
{
"coding" : [
{
"system" : "http://terminology.hl7.org/CodeSystem/v2-0136",
"code" : "Y"
}
],
"text" : "relative time supported"
}
]
},
{
"type" : {
"coding" : [
{
"system" : "urn:iso:std:iso:11073:10101",
"code" : "68223"
}
],
"text" : "MDC_TIME_RES_REL: relative time clock resolution"
},
"valueQuantity" : [
{
"value" : 1000,
"system" : "http://unitsofmeasure.org",
"code" : "us"
}
]
}
]
}
The PHG Device Resource, can, in theory have all the same entries as in the PHD Device Resource plus one additional property that gives the list of certified Health and Fitness interfaces (to downstream servers). A PHG can be certified for both proper operation with PHD specializations as well as proper operation with downstream servers. One of those 'Health and Fitness' interfaces is the upload to RESTFul FHIR servers. Some PHGs also support uploads of the data as PCD-01 and some support questionnaires.
However, the only required PHG entries are the time synchronization protocol and the system id identifier. For compliance with this IG, PHGs must also report the list of certified PHD interfaces and the list of certified Health & Fitness interfaces.
The time synchronization protocol is important as the PHG plays an important role in the measurement timestamps, and may change them from what the PHD reports if warranted.
Only the entries that are different from the PHD are discussed in the following sections.
This field states that the device is a PHG. This IG uses the MDC code MDC_MOC_VMS_MDS_AHD that indicates a gateway. "AHD" stands for Application Hosting Device and is an older name for what is commonly known as a PHG.
In addition to the certified PHD interfaces the PHG can report its certified Health and Fitness interfaces as a list of properties. Each of these properties reports a code that indicates a Health and Fitness interface the PHG has been (self-)certified for.
The property is indicated by the property.type.code
having the MDC code "532355". The valueCode
comes from the ContinuaHFS code system.
An example of a PHG resource is given here.
It is assumed here that the reader has access to the Patient resource uploaded by the PHG and that the PHG uploaded a Patient resource. There is a special case where the PHG will not upload a Patient resource.
The uploaded Patient resource is following the Phd Patient Profile as defined here.
There is only one additional required entry in the Phd Patient Profile; the Patient.identifier.
The required Patient.identifier
entry contains an identifier.type
using the Table 0203 identifierType code system from HL7 v2. The code entry is generally "MR" for medical record number, but other likely entries are "LR" for local registry or "U" for unspecified identifier. The "U" is also used when handling a "John or Jane Doe" unknown patient.
The identifier.value
and identifier.system
entries are used to quantify the entries of the given identifier.type. For example, the identifier.system
might be the institution's XDS.b assigning authority and the identifier.value
the patient record number (also known as the patient identifier). See IHE Cross-Enterprise Document Sharing.
Note that a medical record number is considered PHI in some jurisdictions and use cases. Even when the medical record number is not in itself PHI, the fact that the PHG's communication will convey both the MRN and health data could put the whole communication into the realm of PHI.
An example of a Patient.identifier
following the XDS.b notation is given here.
An example of an unknown patient using the identifier.type
"U" is given here.