From 7cf5d0ebd1ce528ab12dc01d379d886fd274dbd2 Mon Sep 17 00:00:00 2001 From: Paul Kraft Date: Thu, 6 Jun 2024 19:23:07 +0200 Subject: [PATCH 01/15] Add preliminary data scheme to readme --- README.md | 168 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 167 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 12052ad4..0414fb78 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,168 @@ -# ENGAGE-HF-Firebase +# ENGAGE-HF Firebase + Firebase cloud hosting infrastructure for the ENGAGE-HF project. + +# Data Scheme + +This document describes how data is stored in Firestore for the Engage-HF app. + +## Custom Types + +The following section describes custom types defined for this system to be later used + +### LocalizedText + +A LocalizedText object shall be used whenever text requires localization or may require in the future. The object may either simply be a single string (in the case of localizations not being available yet) or a dictionary with string keys and string values. If LocalizedText is represented by a string-string dictionary, the keys represent language-codes following the ISO 639-1 (or if necessary ISO 639-1) standard and the respective text in the given language as value. + +A LocalizedText object cannot be used in FHIR-conforming types due to its incompatibility with the standard. FHIR types commonly contain text in one language only to be specified using the `language` property. + +## /medications + +In this section, we describe information regarding all the medications to be specified in the Engage-HF context. These medications may be used by a clinician for medication requests to a patient (/users/$userId$/medicationRequests) or contra-indications (/users/$userId$/allergyIntolerances). + +### /medications/$medicationId$ + +Based on [FHIR Medication](https://hl7.org/fhir/R4B/medication.html): + +|Property|Type|Values|Comments| +|-|-|-|-| +|id|string|-|[Resource](https://hl7.org/fhir/R4B/resource.html): Logical id of this artifact| +|meta|Meta|-|[Resource](https://hl7.org/fhir/R4B/resource.html#Meta): Metadata about the resource| +|identifier|list of Identifier|-|Business identifier for this medication| +|extension|list of Extension|-|See /medications/$medicationId$/extension for possible values| + +Technically, we could use [FHIR MedicationKnowledge](https://hl7.org/fhir/R4B/medicationknowledge.html), but it doesn't seem to be ready for use - or at least take over the `medicineClassification` property from it. + +### /medications/$medicationId$/extension + +Based on the [Extension](https://hl7.org/fhir/R4B/extensibility.html#Extension) format specified in FHIR, a medication may contain a list of these following properties. Each property will need to get a url assigned to fit the FHIR data format. + +|Property|Type|Values|Comments| +|-|-|-|-| +|medicationClass|string|e.g. "BETABLOCKER"|A medicationClassId referring to a medicationClass specified in /medicationClasses/$medicationClassId$. One medication object may contain multiple medicationClass extension properties.| +|minimumDailyDose|double|e.g. 6.25|Unit: mg/day. May only occur once.| +|targetDailyDose|double|e.g. 50.0|Unit: mg/day. May only occur once.| + +Q: Do we possibly need a connection from a single medication to a video? + +### /medicationClasses/$medicationClassId$ + +|Property|Type|Values|Comments| +|-|-|-|-| +|id|string|e.g. "BETABLOCKER"|| +|name|LocalizedText|-|A name for a given medicationClass to be displayed to a user.| +|videoSectionId|string|-|To be used to retrieve a video using /videos/$videoSectionId$/videos/$videoId$.| +|videoId|string|-|To be used to retrieve a video using /videos/$videoSectionId$/videos/$videoId$.| + +Q: Do we necessarily need a connection between medication classes and videos / videoSections? + +## /videoSections + +In this section, we describe all data related to educational videos to be shown in the Engage-HF mobile apps. The videos are grouped into different categories to be displayed as sections in the mobile apps. + +### /videoSections/$videoSectionId$ + +|Property|Type|Values|Comments| +|-|-|-|-| +|title|LocalizedText|e.g. "ENGAGE-HF Application"|May be localized.| +|description|LocalizedText|e.g. "Helpful videos on the ENGAGE-HF mobile application."|May be localized. Are there different videos / videoSections for each platform?| + +Q: Can we specify a certain order in Firestore or should we add something like an id to order it by? +Q: All videos are shown to all users, or is there any filtering/reordering/difference for any users with respect to other users? +Q: Would we gain a benefit from linking the relevant videos / videoSections to the medications / medication classes? + +### /videoSections/$videoSectionId$/videos/$videoId$ + +|Property|Type|Values|Comments| +|-|-|-|-| +|title|LocalizedText|e.g. "Beta Blockers for Heart Failure"|May be localized.| +|url|LocalizedText|e.g. "https://youtu.be/XfgcXkq61k0"|May be localized.| + +Q: Can we specify a certain order in Firestore or should we add something like an id to order it by? +Q: All videos are shown to all users, or is there any filtering/reordering/difference for any users with respect to other users? + +## /users/$userId$ + +In this section, we describe all user-related data to be stored. + +|Property|Type|Values|Comments| +|-|-|-|-| +|fullName|string|-|Contains a user's full name. TBD: May potentially be split up into firstName/lastName or firstName/middleNames/familyName.| +|dateOfBirth|Date|-|To be used for verification purposes.| +|invitationCode|string|-|The invitationCode to be used when logging in to the app for the first time.| +|language|optional string|e.g. "en"|Following IETF BCP-47 / [FHIR ValueSet languages](https://hl7.org/fhir/R4B/valueset-languages.html)| + +Q: Can we somehow ensure that a given logged in user can only access their own information? Clinicians require access to more patients, but they are currently not reflected as "users". + +### /users/$userId$/devices/$deviceId$ + +This data is required to send push notifications over the [Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging) System. + +|Property|Type|Values|Comments| +|-|-|-|-| +|modifiedDate|DateTime|-|This date is updated whenever the token is sent to the server, even if it is not replaced by a different token. It simply reflects the last date we can definitely confirm the token was active. Idea: We may ignore some devices, if the token has not been updated for a long time, since the app has not been opened for a long time.| +|notificationToken|string|-|The FCM token as received from Firebase in the app. TBD: We may want to make this non-optional and simply not store device information, if there is no available token (e.g. if notifications are restricted).| +|platform|optional string|e.g. "iOS", "Android"|This information is important as context for the `osVersion`, `appVersion` and `appBuild` properties.| +|osVersion|optional string|e.g. "17.5.1"|The version of the OS. Depending on the OS, they may have different formats to be specified separately.| +|appVersion|optional string|e.g. "1.0.1"|The version of the app as it is specified on the App/Play Store.| +|appBuild|optional string|e.g. "56"|The build version of the app as defined by the CI pipeline releasing the app.| +|language|optional string|e.g. "en"|Following IETF BCP-47 / [FHIR ValueSet languages](https://hl7.org/fhir/R4B/valueset-languages.html)| + +Q: Should we specify language/region by user or by device? Currently both a user and a device may contain a language. A notification shall prioritize a device's language setting, fall back to the user's language setting and use `en-US` in all other cases. + +#### Adding a new device or modifying information of an existing one + +A device can only be identified by its notification token. When updating a device's information, we therefore check if the notification token already exists in Firestore. If it already exists, we update all other existing fields' values - otherwise, we create a new device. + +A device may receive a different notification token at any time though. Therefore, we might create a new device, even though that device already exists in the table with a different (now inactive) notification token. Therefore, every time we send out a new notification and receive the information that a token is no longer active, we need to remove the device from this table. + +### /users/$userId$/messages/$messageId$ + +|Property|Type|Values|Comments| +|-|-|-|-| +|dueDate|optional DateTime|-|The due date of the message to be shown in-app.| +|triggerDate|optional DateTime|-|A date to trigger a notification on the device. If not set, then there is no notification to trigger. The notification should be triggered by the server. TBD: Are there cases where a message would trigger multiple times or event- rather than date-driven?| +|completionDate|optional DateTime|-|Specifies when a message has been completed. TBD: Messages containing a completionDate may either be hidden on user's devices or be shown crossed out.| +|title|LocalizedText|e.g. "Watch Welcome Video in Education Page."|May be localized.| +|description|optional LocalizedText|e.g. "The video shows how you will be able to use this app."|May be localized.| +|action|optional string|e.g. "engage-hf:/videoSections/engage-hf/videos/welcome"|Format to be defined, needs to be decoded on a device and performed on tap of the message.| + +### /users/$userId$/allergyIntolerances/$allergyIntoleranceId$ + +Based on [FHIR AllergyIntolerance](https://hl7.org/fhir/R4B/allergyintolerance.html), the following properties may be used, while additional properties are ignored by the Engage-HF system. + +|Property|Type|Values|Comments| +|-|-|-|-| +|id|string|-|[Resource](https://hl7.org/fhir/R4B/resource.html): Logical id of this artifact| +|type|optional [allergyIntoleranceType](https://hl7.org/fhir/R4B/valueset-allergy-intolerance-type.html)|e.g. "allergy", "intolerance"|| +|code|CodableContent|e.g. "{"coding":[{"system":"https://hl7.org/fhir/R4B/valueset-allergyintolerance-code.html","code":"293963004","display":"Cardioselective beta-blocker allergy"}],"text":"Cardioselective beta-blocker allergy"}"|Uses either [AllergyIntoleranceCode](https://hl7.org/fhir/R4B/valueset-allergyintolerance-code.html), `medicationId` as used in /medications/$medicationId$ and/or `medicationId` as used in /medicationClasses/$medicationClassId$.| +|patient|string|e.g. "allergy", "intolerance"|`userId` as used in /users/$userId$ and related collections.| + +### /users/$userId$/medicationRequests/$medicationRequestId$ + +Based on [FHIR MedicationRequest](https://hl7.org/fhir/R4B/medicationrequest.html), the following properties may be used, while additional properties are ignored by the Engage-HF system. + +|Property|Type|Values|Comments| +|-|-|-|-| +|id|string|-|[Resource](https://hl7.org/fhir/R4B/resource.html): Logical id of this artifact| +|type|optional [allergyIntoleranceType](https://hl7.org/fhir/R4B/valueset-allergy-intolerance-type.html)|e.g. "allergy", "intolerance"|| +|code|CodableContent|e.g. "{"coding":[{"system":"https://hl7.org/fhir/R4B/valueset-allergyintolerance-code.html","code":"293963004","display":"Cardioselective beta-blocker allergy"}],"text":"Cardioselective beta-blocker allergy"}"|Uses either [AllergyIntoleranceCode](https://hl7.org/fhir/R4B/valueset-allergyintolerance-code.html), `medicationId` as used in /medications/$medicationId$ and/or `medicationId` as used in /medicationClasses/$medicationClassId$.| +|patient|string|e.g. "allergy", "intolerance"|`userId` as used in /users/$userId$ and related collections.| + +Q: Which codes should we use for contra-indications? We could simply assume a limited set for now (i.e. the ones we allow for selection in the web dashboard), but when interfacing with an EHR, we would need to be able to consider all relevant codes in the algorithm(s). + +### /users/$userId$/observations/$observationId$ + +Based on [FHIR Observation](https://hl7.org/fhir/R4B/observation.html), the following properties may be used, while additional properties are ignored by the Engage-HF system. + +|Property|Type|Values|Comments| +|-|-|-|-| +|id|string|-|[Resource](https://hl7.org/fhir/R4B/resource.html): Logical id of this artifact| + +### /users/$userId$/questionnaireResponses/$questionnaireResponseId$ + +Based on [FHIR QuestionnaireResponse](https://hl7.org/fhir/R4B/questionnaireresponse.html), the following properties may be used, while additional properties are ignored by the Engage-HF system. + +|Property|Type|Values|Comments| +|-|-|-|-| +|id|string|-|[Resource](https://hl7.org/fhir/R4B/resource.html): Logical id of this artifact| From 42b6a46151cce74db519cf08015e0c692ff584ca Mon Sep 17 00:00:00 2001 From: Paul Kraft Date: Mon, 10 Jun 2024 18:09:49 +0200 Subject: [PATCH 02/15] Minor improvements --- README.md | 176 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 156 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 0414fb78..3367fc52 100644 --- a/README.md +++ b/README.md @@ -12,10 +12,55 @@ The following section describes custom types defined for this system to be later ### LocalizedText -A LocalizedText object shall be used whenever text requires localization or may require in the future. The object may either simply be a single string (in the case of localizations not being available yet) or a dictionary with string keys and string values. If LocalizedText is represented by a string-string dictionary, the keys represent language-codes following the ISO 639-1 (or if necessary ISO 639-1) standard and the respective text in the given language as value. +A LocalizedText object shall be used whenever text requires localization or may require in the future. The object may either simply be a single string (in the case of localizations not being available yet) or a dictionary with string keys and string values. If LocalizedText is represented by a string-string dictionary, the keys represent language-codes following the ISO 639-1 (or if necessary ISO 639-2) standard and the respective text in the given language as value. + +Some localizations may require to include regions as well (e.g. Australian/British/American English), so the clients should be aware of this and prioritize the language code with the correct region (`en-us`) over the general code (`en`), if it is present. + +Example: +``` +{ + "en":"Welcome to the Engage-HF app!", + "de":"Willkommen in der Engage-HF App!", + "es":"¡Bienvenido a la aplicación Engage-HF!" +} +``` A LocalizedText object cannot be used in FHIR-conforming types due to its incompatibility with the standard. FHIR types commonly contain text in one language only to be specified using the `language` property. +## /questionnaires + +In this section, we describe all the information stored for questionnaires. + +### /questionnaires/$questionnaireId$ + +Based on [FHIR Questionnaire](https://hl7.org/fhir/R4B/questionnaire.html): + +|Property|Type|Values|Comments| +|-|-|-|-| +|id|string|-|[Resource](https://hl7.org/fhir/R4B/resource.html): Logical id of this artifact| +|meta|Meta|-|[Resource](https://hl7.org/fhir/R4B/resource.html#Meta): Metadata about the resource| +|identifier|list of Identifier|-|Business identifier for this questionnaire. There may be multiple questionnaire objects in this list, with differing `id` and `language` properties, but a common business identifier.| +|title|string|-|Human-friendly title of the questionnaire.| +|date|DateTime|-|last modified date| +|version|string|-|Business version of the questionnaire.| +|item|list of BackboneElement|-|items as defined in [FHIR Questionnaire](https://hl7.org/fhir/R4B/questionnaire.html)| +|language|optional string|e.g. "en"|Following IETF BCP-47 / [FHIR ValueSet languages](https://hl7.org/fhir/R4B/valueset-languages.html)| + +#### Items + +Items are commonly encoded using the following properties: + +|Property|Type|Values|Comments| +|-|-|-|-| +|linkId|string|-|Unique id for item in questionnaire| +|definition|optional uri|-|Details for the item| +|prefix|optional string|e.g. "1(a)", "2.5.3"|Prefix of the item that isn't actually part of the name but may still be displayed.| +|text|string|-|Primary text for the item| +|type|code|e.g. "group", "display", "boolean", "decimal", "integer", "date", etc|See [QuestionnaireItemType](https://hl7.org/fhir/R4B/valueset-item-type.html) for available values.| +|date|DateTime|-|last modified date| + +#### Example + ## /medications In this section, we describe information regarding all the medications to be specified in the Engage-HF context. These medications may be used by a clinician for medication requests to a patient (/users/$userId$/medicationRequests) or contra-indications (/users/$userId$/allergyIntolerances). @@ -43,18 +88,13 @@ Based on the [Extension](https://hl7.org/fhir/R4B/extensibility.html#Extension) |minimumDailyDose|double|e.g. 6.25|Unit: mg/day. May only occur once.| |targetDailyDose|double|e.g. 50.0|Unit: mg/day. May only occur once.| -Q: Do we possibly need a connection from a single medication to a video? - ### /medicationClasses/$medicationClassId$ |Property|Type|Values|Comments| |-|-|-|-| |id|string|e.g. "BETABLOCKER"|| |name|LocalizedText|-|A name for a given medicationClass to be displayed to a user.| -|videoSectionId|string|-|To be used to retrieve a video using /videos/$videoSectionId$/videos/$videoId$.| -|videoId|string|-|To be used to retrieve a video using /videos/$videoSectionId$/videos/$videoId$.| - -Q: Do we necessarily need a connection between medication classes and videos / videoSections? +|videoPath|string|e.g. "/videoSectionId/1/videos/2"|The path to retrieve the respective video from Firestore.| ## /videoSections @@ -66,10 +106,7 @@ In this section, we describe all data related to educational videos to be shown |-|-|-|-| |title|LocalizedText|e.g. "ENGAGE-HF Application"|May be localized.| |description|LocalizedText|e.g. "Helpful videos on the ENGAGE-HF mobile application."|May be localized. Are there different videos / videoSections for each platform?| - -Q: Can we specify a certain order in Firestore or should we add something like an id to order it by? -Q: All videos are shown to all users, or is there any filtering/reordering/difference for any users with respect to other users? -Q: Would we gain a benefit from linking the relevant videos / videoSections to the medications / medication classes? +|orderIndex|integer|e.g. 1|Since Firestore collections aren't necessarily ordered, we have this property to order the elements by on the clients. The list is supposed to be ordered ascending by `orderIndex`.| ### /videoSections/$videoSectionId$/videos/$videoId$ @@ -77,13 +114,11 @@ Q: Would we gain a benefit from linking the relevant videos / videoSections to t |-|-|-|-| |title|LocalizedText|e.g. "Beta Blockers for Heart Failure"|May be localized.| |url|LocalizedText|e.g. "https://youtu.be/XfgcXkq61k0"|May be localized.| - -Q: Can we specify a certain order in Firestore or should we add something like an id to order it by? -Q: All videos are shown to all users, or is there any filtering/reordering/difference for any users with respect to other users? +|orderIndex|integer|e.g. 1|Since Firestore collections aren't necessarily ordered, we have this property to order the elements by on the clients. The list is supposed to be ordered ascending by `orderIndex`.| ## /users/$userId$ -In this section, we describe all user-related data to be stored. +In this section, we describe all user-related data to be stored. The security rules shall be set up in a way to only allow for a patient to access its own information and a clinician to access all patients' information (or even more restrictive, if needed). |Property|Type|Values|Comments| |-|-|-|-| @@ -92,8 +127,6 @@ In this section, we describe all user-related data to be stored. |invitationCode|string|-|The invitationCode to be used when logging in to the app for the first time.| |language|optional string|e.g. "en"|Following IETF BCP-47 / [FHIR ValueSet languages](https://hl7.org/fhir/R4B/valueset-languages.html)| -Q: Can we somehow ensure that a given logged in user can only access their own information? Clinicians require access to more patients, but they are currently not reflected as "users". - ### /users/$userId$/devices/$deviceId$ This data is required to send push notifications over the [Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging) System. @@ -108,7 +141,7 @@ This data is required to send push notifications over the [Firebase Cloud Messag |appBuild|optional string|e.g. "56"|The build version of the app as defined by the CI pipeline releasing the app.| |language|optional string|e.g. "en"|Following IETF BCP-47 / [FHIR ValueSet languages](https://hl7.org/fhir/R4B/valueset-languages.html)| -Q: Should we specify language/region by user or by device? Currently both a user and a device may contain a language. A notification shall prioritize a device's language setting, fall back to the user's language setting and use `en-US` in all other cases. +Push notifications over APNS / FCM only contain text in a single language. For this, the device's `language` property shall be prioritized, falling back on the user's `language` property and using US-English if both are not present. #### Adding a new device or modifying information of an existing one @@ -123,9 +156,14 @@ A device may receive a different notification token at any time though. Therefor |dueDate|optional DateTime|-|The due date of the message to be shown in-app.| |triggerDate|optional DateTime|-|A date to trigger a notification on the device. If not set, then there is no notification to trigger. The notification should be triggered by the server. TBD: Are there cases where a message would trigger multiple times or event- rather than date-driven?| |completionDate|optional DateTime|-|Specifies when a message has been completed. TBD: Messages containing a completionDate may either be hidden on user's devices or be shown crossed out.| +|type|optional string|e.g. "questionnaireReminder"|Some messages are sent out on a regular basis, where only the most recent message is really relevant for the patient (e.g. a reminder for a questionnaire). With this property, we can easily find existing messages of the same type and replace them with a new one, if necessary.| |title|LocalizedText|e.g. "Watch Welcome Video in Education Page."|May be localized.| |description|optional LocalizedText|e.g. "The video shows how you will be able to use this app."|May be localized.| -|action|optional string|e.g. "engage-hf:/videoSections/engage-hf/videos/welcome"|Format to be defined, needs to be decoded on a device and performed on tap of the message.| +|action|optional string|e.g. "engage-hf:/videoSections/engage-hf/videos/welcome"|See "Available message actions".| + +#### Available message actions + +TODO: This subsection shall describe the format of actions to be performed by the clients on tap of a message. ### /users/$userId$/allergyIntolerances/$allergyIntoleranceId$ @@ -136,7 +174,7 @@ Based on [FHIR AllergyIntolerance](https://hl7.org/fhir/R4B/allergyintolerance.h |id|string|-|[Resource](https://hl7.org/fhir/R4B/resource.html): Logical id of this artifact| |type|optional [allergyIntoleranceType](https://hl7.org/fhir/R4B/valueset-allergy-intolerance-type.html)|e.g. "allergy", "intolerance"|| |code|CodableContent|e.g. "{"coding":[{"system":"https://hl7.org/fhir/R4B/valueset-allergyintolerance-code.html","code":"293963004","display":"Cardioselective beta-blocker allergy"}],"text":"Cardioselective beta-blocker allergy"}"|Uses either [AllergyIntoleranceCode](https://hl7.org/fhir/R4B/valueset-allergyintolerance-code.html), `medicationId` as used in /medications/$medicationId$ and/or `medicationId` as used in /medicationClasses/$medicationClassId$.| -|patient|string|e.g. "allergy", "intolerance"|`userId` as used in /users/$userId$ and related collections.| +|patient|string|-|`userId` as used in /users/$userId$ and related collections.| ### /users/$userId$/medicationRequests/$medicationRequestId$ @@ -147,10 +185,30 @@ Based on [FHIR MedicationRequest](https://hl7.org/fhir/R4B/medicationrequest.htm |id|string|-|[Resource](https://hl7.org/fhir/R4B/resource.html): Logical id of this artifact| |type|optional [allergyIntoleranceType](https://hl7.org/fhir/R4B/valueset-allergy-intolerance-type.html)|e.g. "allergy", "intolerance"|| |code|CodableContent|e.g. "{"coding":[{"system":"https://hl7.org/fhir/R4B/valueset-allergyintolerance-code.html","code":"293963004","display":"Cardioselective beta-blocker allergy"}],"text":"Cardioselective beta-blocker allergy"}"|Uses either [AllergyIntoleranceCode](https://hl7.org/fhir/R4B/valueset-allergyintolerance-code.html), `medicationId` as used in /medications/$medicationId$ and/or `medicationId` as used in /medicationClasses/$medicationClassId$.| +|dosageInstruction|Dosage|-|-| |patient|string|e.g. "allergy", "intolerance"|`userId` as used in /users/$userId$ and related collections.| Q: Which codes should we use for contra-indications? We could simply assume a limited set for now (i.e. the ones we allow for selection in the web dashboard), but when interfacing with an EHR, we would need to be able to consider all relevant codes in the algorithm(s). +#### /users/$userId$/medicationRequests/$medicationRequestId$/dosageInstruction + +|Property|Type|Values|Comments| +|-|-|-|-| +|id|string|-|[Resource](https://hl7.org/fhir/R4B/resource.html): Logical id of this artifact| +|text|optional string|-|Free text dosage instructions| +|additionalInstruction|list of CodableConcept|information like "with meals", "may cause drowsiness", etc|Supplemental instruction or warnings to the patient| +|patientInstruction|optional string|-|Patient or consumer oriented instructions| +|timing|optional [Timing](https://hl7.org/fhir/R4B/datatypes.html#timing)|-|When medication should be administered| +|doseAndRate|list of Element|-|Amount of medication administered| +|doseAndRate>type|optional [DoseRateType](https://hl7.org/fhir/R4B/codesystem-dose-rate-type.html)|e.g. "calculated", "ordered"|| +|doseAndRate>dose|[Range](https://hl7.org/fhir/R4B/datatypes.html#Range) or [SimpleQuantity](https://hl7.org/fhir/R4B/datatypes.html#SimpleQuantity)|-|-| +|doseAndRate>rate|[Ratio](https://build.fhir.org/datatypes.html#ratio) or [Range](https://hl7.org/fhir/R4B/datatypes.html#Range) or [SimpleQuantity](https://hl7.org/fhir/R4B/datatypes.html#SimpleQuantity)|-|-| +|maxDosePerPeriod|optional [Ratio](https://build.fhir.org/datatypes.html#ratio)|-|Upper limit on medication per unit of time| +|maxDosePerAdministration|optional [SimpleQuantity](https://build.fhir.org/datatypes.html#SimpleQuantity)|-|Upper limit on medication per administration| +|maxDosePerLifetime|optional [SimpleQuantity](https://build.fhir.org/datatypes.html#SimpleQuantity)|-|Upper limit on medication per unit of time| + +TBD: Which timings, doses and rates does the system need to be able to work with? How does this differ between input and processing (e.g. an algorithm might only be interested in the total amount administered per day/week)? + ### /users/$userId$/observations/$observationId$ Based on [FHIR Observation](https://hl7.org/fhir/R4B/observation.html), the following properties may be used, while additional properties are ignored by the Engage-HF system. @@ -158,6 +216,84 @@ Based on [FHIR Observation](https://hl7.org/fhir/R4B/observation.html), the foll |Property|Type|Values|Comments| |-|-|-|-| |id|string|-|[Resource](https://hl7.org/fhir/R4B/resource.html): Logical id of this artifact| +|identifier|string|-|[Resource](https://hl7.org/fhir/R4B/resource.html): Logical id of this artifact| + +#### Blood Pressure + +``` +{ + "code": "mm[Hg]", + "system": "http://unitsofmeasure.org", + "unit": "mmHg", + "value": 120 +} +``` + +#### Body Mass + +codes: + +``` +{ + "code": "29463-7", + "display": "Body weight", + "system": "http://loinc.org" +} +``` + +``` +{ + "code": "HKQuantityTypeIdentifierBodyMass", + "display": "Body Mass", + "system": "http://developer.apple.com/documentation/healthkit" +} +``` + +TODO: Health Connect?! + +values: + +``` +{ + "code": "[lb_av]", + "system": "http://unitsofmeasure.org", + "unit": "lbs", + "value": 60 +} +``` + +#### Body Mass (Lean) + +codes: + +``` +{ + "code": "91557-9", + "display": "Lean body weight", + "system": "http://loinc.org" +} +``` + +``` +{ + "code": "HKQuantityTypeIdentifierLeanBodyMass", + "display": "Lean Body Mass", + "system": "http://developer.apple.com/documentation/healthkit" +} +``` + +TODO: HealthConnect?! + +values: + +``` +{ + "code": "[lb_av]", + "system": "http://unitsofmeasure.org", + "unit": "lbs", + "value": 60 +} +``` ### /users/$userId$/questionnaireResponses/$questionnaireResponseId$ From 15541b07d124d146b8796607800a91a90bd8046b Mon Sep 17 00:00:00 2001 From: Paul Kraft Date: Tue, 11 Jun 2024 15:53:18 +0200 Subject: [PATCH 03/15] Improve data scheme --- README.md | 128 +++++++++++++++++++++--------------------------------- 1 file changed, 50 insertions(+), 78 deletions(-) diff --git a/README.md b/README.md index 3367fc52..c3d75a0a 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,10 @@ A LocalizedText object shall be used whenever text requires localization or may Some localizations may require to include regions as well (e.g. Australian/British/American English), so the clients should be aware of this and prioritize the language code with the correct region (`en-us`) over the general code (`en`), if it is present. -Example: +A LocalizedText object cannot be used in FHIR-conforming types due to its incompatibility with the standard. FHIR types commonly contain text in one language only to be specified using the `language` property. + +#### Example + ``` { "en":"Welcome to the Engage-HF app!", @@ -25,7 +28,6 @@ Example: } ``` -A LocalizedText object cannot be used in FHIR-conforming types due to its incompatibility with the standard. FHIR types commonly contain text in one language only to be specified using the `language` property. ## /questionnaires @@ -61,6 +63,8 @@ Items are commonly encoded using the following properties: #### Example +TODO: Create KCCQ-12 questionnaire using FHIR data format. + ## /medications In this section, we describe information regarding all the medications to be specified in the Engage-HF context. These medications may be used by a clinician for medication requests to a patient (/users/$userId$/medicationRequests) or contra-indications (/users/$userId$/allergyIntolerances). @@ -96,12 +100,10 @@ Based on the [Extension](https://hl7.org/fhir/R4B/extensibility.html#Extension) |name|LocalizedText|-|A name for a given medicationClass to be displayed to a user.| |videoPath|string|e.g. "/videoSectionId/1/videos/2"|The path to retrieve the respective video from Firestore.| -## /videoSections +## /videoSections/$videoSectionId$ In this section, we describe all data related to educational videos to be shown in the Engage-HF mobile apps. The videos are grouped into different categories to be displayed as sections in the mobile apps. -### /videoSections/$videoSectionId$ - |Property|Type|Values|Comments| |-|-|-|-| |title|LocalizedText|e.g. "ENGAGE-HF Application"|May be localized.| @@ -201,12 +203,14 @@ Q: Which codes should we use for contra-indications? We could simply assume a li |timing|optional [Timing](https://hl7.org/fhir/R4B/datatypes.html#timing)|-|When medication should be administered| |doseAndRate|list of Element|-|Amount of medication administered| |doseAndRate>type|optional [DoseRateType](https://hl7.org/fhir/R4B/codesystem-dose-rate-type.html)|e.g. "calculated", "ordered"|| -|doseAndRate>dose|[Range](https://hl7.org/fhir/R4B/datatypes.html#Range) or [SimpleQuantity](https://hl7.org/fhir/R4B/datatypes.html#SimpleQuantity)|-|-| -|doseAndRate>rate|[Ratio](https://build.fhir.org/datatypes.html#ratio) or [Range](https://hl7.org/fhir/R4B/datatypes.html#Range) or [SimpleQuantity](https://hl7.org/fhir/R4B/datatypes.html#SimpleQuantity)|-|-| +|doseAndRate>dose|optional [Range](https://hl7.org/fhir/R4B/datatypes.html#Range) or [SimpleQuantity](https://hl7.org/fhir/R4B/datatypes.html#SimpleQuantity)|-|-| +|doseAndRate>rate|optional [Ratio](https://build.fhir.org/datatypes.html#ratio) or [Range](https://hl7.org/fhir/R4B/datatypes.html#Range) or [SimpleQuantity](https://hl7.org/fhir/R4B/datatypes.html#SimpleQuantity)|-|-| |maxDosePerPeriod|optional [Ratio](https://build.fhir.org/datatypes.html#ratio)|-|Upper limit on medication per unit of time| |maxDosePerAdministration|optional [SimpleQuantity](https://build.fhir.org/datatypes.html#SimpleQuantity)|-|Upper limit on medication per administration| |maxDosePerLifetime|optional [SimpleQuantity](https://build.fhir.org/datatypes.html#SimpleQuantity)|-|Upper limit on medication per unit of time| +TBD: Do we need to be able to specify rate vs dose? i.e. are there scenarios where a clinician would like to just specify "take this amount in this time" rather than "take one pill every evening"? + TBD: Which timings, doses and rates does the system need to be able to work with? How does this differ between input and processing (e.g. an algorithm might only be interested in the total amount administered per day/week)? ### /users/$userId$/observations/$observationId$ @@ -216,84 +220,39 @@ Based on [FHIR Observation](https://hl7.org/fhir/R4B/observation.html), the foll |Property|Type|Values|Comments| |-|-|-|-| |id|string|-|[Resource](https://hl7.org/fhir/R4B/resource.html): Logical id of this artifact| -|identifier|string|-|[Resource](https://hl7.org/fhir/R4B/resource.html): Logical id of this artifact| +|status|[ObservationStatus](https://hl7.org/fhir/R4B/valueset-observation-status.html)|e.g. "final"|This value is most likely "final" in every case.| +|code|[Code](https://hl7.org/fhir/R4B/valueset-observation-codes.html)|e.g. `{"system":"http://loinc.org","code":"55423-8","display":"Number of steps"}`|Use one of the codes mentioned below.| +|value|optional [Quantity](https://hl7.org/fhir/R4B/datatypes.html#Quantity)|e.g. `{"code":"mm[Hg]","system":"http://unitsofmeasure.org","unit":"mmHg","value":120}`|Use one of the units listed below.| +|component|list of components|-|Instead of containing a single `value` property, some observations are composed of multiple components (e.g. a blood pressure observation contains a diastolic and systolic component).| +|component[x]>code|[Code](https://hl7.org/fhir/R4B/valueset-observation-codes.html)|e.g. `{"system":"http://loinc.org","code":"55423-8","display":"Number of steps"}`|Use one of the codes mentioned below.| +|component[x]>value|optional [Quantity](https://hl7.org/fhir/R4B/datatypes.html#Quantity)|e.g. `{"code":"mm[Hg]","system":"http://unitsofmeasure.org","unit":"mmHg","value":120}`|Use one of the units listed below.| +|effective|[Period](https://fhir-ru.github.io/datatypes.html#Period)|-|For observations that happened in only one instant, we use periods with the same start and end time.| -#### Blood Pressure +TBD: The fixed use of the period type in the `effective` property originates in HealthConnectOnFHIR. Should we also allow DateTime for instant observations? -``` -{ - "code": "mm[Hg]", - "system": "http://unitsofmeasure.org", - "unit": "mmHg", - "value": 120 -} -``` +#### Compound Observations -#### Body Mass +|code>system|code>code|code>display|value|components| +|-|-|-|-|-|-| +|"http://loinc.org"|"85354-9"|"Blood pressure panel with all children optional"|-|"Diastolic blood pressure", "Systolic blood pressure"| -codes: +#### Simple Observations -``` -{ - "code": "29463-7", - "display": "Body weight", - "system": "http://loinc.org" -} -``` +|code>system|code>code|code>display|value>value|value>code|value>unit| +|-|-|-|-|-|-| +|"http://loinc.org"|"55423-8"|"Number of steps"|double|?|"steps"| +|"http://loinc.org"|"91557-9"|"Lean body weight"|double|"[lb_av]"|"g" or "lbs"| +|"http://loinc.org"|"29463-7"|"Body weight"|double|"[lb_av]"|"g" or "lbs"| +|"http://loinc.org"|"41981-2"|"Calories burned"|double|?|"kcal"| +|"http://loinc.org"|"8302-2"|"Body height"|double|?|"m"| +|"http://loinc.org"|"8867-4"|"Heart rate"|double|?|"beats/minute"| +|"http://loinc.org"|"8310-5"|"Body temperature"|double|?|"°C"| +|"http://loinc.org"|"8462-4"|"Diastolic blood pressure"|double|"mm[Hg]"|"mmHg"| +|"http://loinc.org"|"8480-6"|"Systolic blood pressure"|double|"mm[Hg]"|"mmHg"| -``` -{ - "code": "HKQuantityTypeIdentifierBodyMass", - "display": "Body Mass", - "system": "http://developer.apple.com/documentation/healthkit" -} -``` - -TODO: Health Connect?! +TODO: Currently, HealthKitOnFHIR and HealthConnectOnFHIR still use different units to encode the same observations. We should probably aim to always use the same unit to reduce unit conversions, but each client would need to be able to handle multiple units for each observation type. We should probably aim for SI units, even though the system will primarily be used in the US. TBD. -values: - -``` -{ - "code": "[lb_av]", - "system": "http://unitsofmeasure.org", - "unit": "lbs", - "value": 60 -} -``` - -#### Body Mass (Lean) - -codes: - -``` -{ - "code": "91557-9", - "display": "Lean body weight", - "system": "http://loinc.org" -} -``` - -``` -{ - "code": "HKQuantityTypeIdentifierLeanBodyMass", - "display": "Lean Body Mass", - "system": "http://developer.apple.com/documentation/healthkit" -} -``` - -TODO: HealthConnect?! - -values: - -``` -{ - "code": "[lb_av]", - "system": "http://unitsofmeasure.org", - "unit": "lbs", - "value": 60 -} -``` +[Codes/Units in HealthKitOnFHIR](https://github.com/StanfordBDHG/HealthKitOnFHIR/blob/main/Sources/HealthKitOnFHIR/Resources/HKSampleMapping.json) ### /users/$userId$/questionnaireResponses/$questionnaireResponseId$ @@ -302,3 +261,16 @@ Based on [FHIR QuestionnaireResponse](https://hl7.org/fhir/R4B/questionnaireresp |Property|Type|Values|Comments| |-|-|-|-| |id|string|-|[Resource](https://hl7.org/fhir/R4B/resource.html): Logical id of this artifact| +|questionnaire|string|-|canonical representation of the questionnaire, i.e. t| +|author|string|-|The patient's id| +|source|string|-|The patient's id| +|authored|DateTime|-|The date the answers were gathered.| +|status|[QuestionnaireResponseStatus](https://hl7.org/fhir/R4B/valueset-questionnaire-answers-status.html)|-|Will most likely always be `completed`.| +|item|list of Item|-|-| +|item[x]>linkId|string|-|Pointer to specific item from questionnaire| +|item[x]>definition|optional uri|-|details for item| +|item[x]>text|optional string|-|Name for group or question text| +|item[x]>answer|list of Answer|-|response(s) to the question| +|item[x]>answer[y]>value|any|-|Value depending on the type of question in the survey, e.g. boolean, integer, date, string, etc| + +TBD: Should we use `source` and/or `patient` to store a reference to the patient? From 43a70fc7f496045b3e6c0eefaa26da505b296e90 Mon Sep 17 00:00:00 2001 From: Paul Kraft Date: Tue, 11 Jun 2024 16:08:10 +0200 Subject: [PATCH 04/15] Minor improvements --- README.md | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index c3d75a0a..38d9f619 100644 --- a/README.md +++ b/README.md @@ -45,21 +45,13 @@ Based on [FHIR Questionnaire](https://hl7.org/fhir/R4B/questionnaire.html): |title|string|-|Human-friendly title of the questionnaire.| |date|DateTime|-|last modified date| |version|string|-|Business version of the questionnaire.| -|item|list of BackboneElement|-|items as defined in [FHIR Questionnaire](https://hl7.org/fhir/R4B/questionnaire.html)| |language|optional string|e.g. "en"|Following IETF BCP-47 / [FHIR ValueSet languages](https://hl7.org/fhir/R4B/valueset-languages.html)| - -#### Items - -Items are commonly encoded using the following properties: - -|Property|Type|Values|Comments| -|-|-|-|-| -|linkId|string|-|Unique id for item in questionnaire| -|definition|optional uri|-|Details for the item| -|prefix|optional string|e.g. "1(a)", "2.5.3"|Prefix of the item that isn't actually part of the name but may still be displayed.| -|text|string|-|Primary text for the item| -|type|code|e.g. "group", "display", "boolean", "decimal", "integer", "date", etc|See [QuestionnaireItemType](https://hl7.org/fhir/R4B/valueset-item-type.html) for available values.| -|date|DateTime|-|last modified date| +|item|list of BackboneElement|-|items as defined in [FHIR Questionnaire](https://hl7.org/fhir/R4B/questionnaire.html)| +|item[x]>linkId|string|-|Unique id for item in questionnaire| +|item[x]>definition|optional uri|-|Details for the item| +|item[x]>prefix|optional string|e.g. "1(a)", "2.5.3"|Prefix of the item that isn't actually part of the name but may still be displayed.| +|item[x]>text|string|-|Primary text for the item| +|item[x]>type|code|e.g. "group", "display", "boolean", "decimal", "integer", "date", etc|See [QuestionnaireItemType](https://hl7.org/fhir/R4B/valueset-item-type.html) for available values.| #### Example @@ -80,11 +72,7 @@ Based on [FHIR Medication](https://hl7.org/fhir/R4B/medication.html): |identifier|list of Identifier|-|Business identifier for this medication| |extension|list of Extension|-|See /medications/$medicationId$/extension for possible values| -Technically, we could use [FHIR MedicationKnowledge](https://hl7.org/fhir/R4B/medicationknowledge.html), but it doesn't seem to be ready for use - or at least take over the `medicineClassification` property from it. - -### /medications/$medicationId$/extension - -Based on the [Extension](https://hl7.org/fhir/R4B/extensibility.html#Extension) format specified in FHIR, a medication may contain a list of these following properties. Each property will need to get a url assigned to fit the FHIR data format. +Based on the [Extension](https://hl7.org/fhir/R4B/extensibility.html#Extension) format specified in FHIR, a medication may contain a list of these following extension properties. Each property will need to get a url assigned to fit the FHIR data format. |Property|Type|Values|Comments| |-|-|-|-| From 33f34b53af158b02245931bec91cf1e9225bb8f2 Mon Sep 17 00:00:00 2001 From: Paul Kraft Date: Tue, 11 Jun 2024 16:09:33 +0200 Subject: [PATCH 05/15] Remove unnecessary property --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 38d9f619..5eaf0446 100644 --- a/README.md +++ b/README.md @@ -173,7 +173,6 @@ Based on [FHIR MedicationRequest](https://hl7.org/fhir/R4B/medicationrequest.htm |Property|Type|Values|Comments| |-|-|-|-| |id|string|-|[Resource](https://hl7.org/fhir/R4B/resource.html): Logical id of this artifact| -|type|optional [allergyIntoleranceType](https://hl7.org/fhir/R4B/valueset-allergy-intolerance-type.html)|e.g. "allergy", "intolerance"|| |code|CodableContent|e.g. "{"coding":[{"system":"https://hl7.org/fhir/R4B/valueset-allergyintolerance-code.html","code":"293963004","display":"Cardioselective beta-blocker allergy"}],"text":"Cardioselective beta-blocker allergy"}"|Uses either [AllergyIntoleranceCode](https://hl7.org/fhir/R4B/valueset-allergyintolerance-code.html), `medicationId` as used in /medications/$medicationId$ and/or `medicationId` as used in /medicationClasses/$medicationClassId$.| |dosageInstruction|Dosage|-|-| |patient|string|e.g. "allergy", "intolerance"|`userId` as used in /users/$userId$ and related collections.| From f0beb593341b5cd4390af3bbdac674414b85e2e3 Mon Sep 17 00:00:00 2001 From: Paul Kraft Date: Tue, 11 Jun 2024 16:13:54 +0200 Subject: [PATCH 06/15] Improve medicationRequest --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 5eaf0446..00ac46f3 100644 --- a/README.md +++ b/README.md @@ -166,6 +166,8 @@ Based on [FHIR AllergyIntolerance](https://hl7.org/fhir/R4B/allergyintolerance.h |code|CodableContent|e.g. "{"coding":[{"system":"https://hl7.org/fhir/R4B/valueset-allergyintolerance-code.html","code":"293963004","display":"Cardioselective beta-blocker allergy"}],"text":"Cardioselective beta-blocker allergy"}"|Uses either [AllergyIntoleranceCode](https://hl7.org/fhir/R4B/valueset-allergyintolerance-code.html), `medicationId` as used in /medications/$medicationId$ and/or `medicationId` as used in /medicationClasses/$medicationClassId$.| |patient|string|-|`userId` as used in /users/$userId$ and related collections.| +Q: Which codes should we use for contra-indications? We could simply assume a limited set for now (i.e. the ones we allow for selection in the web dashboard), but when interfacing with an EHR, we would need to be able to consider all relevant codes in the algorithm(s). + ### /users/$userId$/medicationRequests/$medicationRequestId$ Based on [FHIR MedicationRequest](https://hl7.org/fhir/R4B/medicationrequest.html), the following properties may be used, while additional properties are ignored by the Engage-HF system. @@ -173,13 +175,11 @@ Based on [FHIR MedicationRequest](https://hl7.org/fhir/R4B/medicationrequest.htm |Property|Type|Values|Comments| |-|-|-|-| |id|string|-|[Resource](https://hl7.org/fhir/R4B/resource.html): Logical id of this artifact| -|code|CodableContent|e.g. "{"coding":[{"system":"https://hl7.org/fhir/R4B/valueset-allergyintolerance-code.html","code":"293963004","display":"Cardioselective beta-blocker allergy"}],"text":"Cardioselective beta-blocker allergy"}"|Uses either [AllergyIntoleranceCode](https://hl7.org/fhir/R4B/valueset-allergyintolerance-code.html), `medicationId` as used in /medications/$medicationId$ and/or `medicationId` as used in /medicationClasses/$medicationClassId$.| +|medication|Reference(Medication) or CodeableConcept|-|TBD: `medicationId` as used in /medications/$medicationId$ or a CodeableConcept containing the same information as one of the medications listed in /medications/$medicationId$| |dosageInstruction|Dosage|-|-| |patient|string|e.g. "allergy", "intolerance"|`userId` as used in /users/$userId$ and related collections.| -Q: Which codes should we use for contra-indications? We could simply assume a limited set for now (i.e. the ones we allow for selection in the web dashboard), but when interfacing with an EHR, we would need to be able to consider all relevant codes in the algorithm(s). - -#### /users/$userId$/medicationRequests/$medicationRequestId$/dosageInstruction +The `dosageInstruction` property may contain values containing the following properties: |Property|Type|Values|Comments| |-|-|-|-| From 63e41da2ca4e01b01e7cb4a7cb564938eda12489 Mon Sep 17 00:00:00 2001 From: Paul Kraft Date: Tue, 11 Jun 2024 17:27:11 +0200 Subject: [PATCH 07/15] Add messages settings to user and remove name --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 00ac46f3..82d43de7 100644 --- a/README.md +++ b/README.md @@ -112,10 +112,14 @@ In this section, we describe all user-related data to be stored. The security ru |Property|Type|Values|Comments| |-|-|-|-| -|fullName|string|-|Contains a user's full name. TBD: May potentially be split up into firstName/lastName or firstName/middleNames/familyName.| |dateOfBirth|Date|-|To be used for verification purposes.| |invitationCode|string|-|The invitationCode to be used when logging in to the app for the first time.| |language|optional string|e.g. "en"|Following IETF BCP-47 / [FHIR ValueSet languages](https://hl7.org/fhir/R4B/valueset-languages.html)| +|dailyRemindersAreActive|boolean|true, false|Decides whether to send out daily reminder messages for this user.| +|textNotificationsAreActive|boolean|true, false|Decides whether to send text notifications for this user.| +|medicationRemindersAreActive|boolean|true, false|Decides whether to send medication reminder messages for this user.| + +TBD: We might want to group `dailyRemindersAreActive`, `textNotificationsAreActive ` and `medicationRemindersAreActive ` into one object, e.g. `MessagesSettings`. ### /users/$userId$/devices/$deviceId$ From 7b2d093b84f73e1a5ecfae569d8e0bff5e609aa3 Mon Sep 17 00:00:00 2001 From: Paul Kraft Date: Tue, 11 Jun 2024 17:41:14 +0200 Subject: [PATCH 08/15] Include timeZone in user information --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 82d43de7..35209b4e 100644 --- a/README.md +++ b/README.md @@ -118,6 +118,9 @@ In this section, we describe all user-related data to be stored. The security ru |dailyRemindersAreActive|boolean|true, false|Decides whether to send out daily reminder messages for this user.| |textNotificationsAreActive|boolean|true, false|Decides whether to send text notifications for this user.| |medicationRemindersAreActive|boolean|true, false|Decides whether to send medication reminder messages for this user.| +|timeZone|string|e.g. "America/Los_Angeles"|The value needs to correspond to an identifier from [TZDB](https://nodatime.org/TimeZones). It must not be an offset to UTC/GMT, since that wouldn't work well with daylight-savings (even if there is no daylight-savings time at that location). Also, don't use common abbreviations like PST, PDT, CEST, etc (they may be ambiguous, e.g. CST).| + +TBD: What happens if there timeZone could not be found? When would we send out messages? TBD: We might want to group `dailyRemindersAreActive`, `textNotificationsAreActive ` and `medicationRemindersAreActive ` into one object, e.g. `MessagesSettings`. From 7e2506ff2b33eb0c5b0a4814bd09a6bc5dce6621 Mon Sep 17 00:00:00 2001 From: Paul Kraft Date: Tue, 11 Jun 2024 17:42:55 +0200 Subject: [PATCH 09/15] Include timeZone in user information --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 35209b4e..cc097b14 100644 --- a/README.md +++ b/README.md @@ -120,7 +120,7 @@ In this section, we describe all user-related data to be stored. The security ru |medicationRemindersAreActive|boolean|true, false|Decides whether to send medication reminder messages for this user.| |timeZone|string|e.g. "America/Los_Angeles"|The value needs to correspond to an identifier from [TZDB](https://nodatime.org/TimeZones). It must not be an offset to UTC/GMT, since that wouldn't work well with daylight-savings (even if there is no daylight-savings time at that location). Also, don't use common abbreviations like PST, PDT, CEST, etc (they may be ambiguous, e.g. CST).| -TBD: What happens if there timeZone could not be found? When would we send out messages? +TBD: What happens if the timeZone could not be identified? When would we send out messages? TBD: We might want to group `dailyRemindersAreActive`, `textNotificationsAreActive ` and `medicationRemindersAreActive ` into one object, e.g. `MessagesSettings`. From ad3ad199e3da69bb949b6fe5ffdccdbbffaab2d9 Mon Sep 17 00:00:00 2001 From: Paul Date: Tue, 11 Jun 2024 20:55:57 +0200 Subject: [PATCH 10/15] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cc097b14..e8a82fa1 100644 --- a/README.md +++ b/README.md @@ -183,7 +183,7 @@ Based on [FHIR MedicationRequest](https://hl7.org/fhir/R4B/medicationrequest.htm |-|-|-|-| |id|string|-|[Resource](https://hl7.org/fhir/R4B/resource.html): Logical id of this artifact| |medication|Reference(Medication) or CodeableConcept|-|TBD: `medicationId` as used in /medications/$medicationId$ or a CodeableConcept containing the same information as one of the medications listed in /medications/$medicationId$| -|dosageInstruction|Dosage|-|-| +|dosageInstruction|list of Dosage|-|-| |patient|string|e.g. "allergy", "intolerance"|`userId` as used in /users/$userId$ and related collections.| The `dosageInstruction` property may contain values containing the following properties: From 77b314c4c0b67052f2e4a999385873b9e38718c5 Mon Sep 17 00:00:00 2001 From: Paul Kraft Date: Wed, 12 Jun 2024 15:19:07 +0200 Subject: [PATCH 11/15] Add KCCQ-12 questionnaire --- README.md | 47 ++++++++++++++++++++++++++++++++-------------- kccq-12-en-US.json | 1 + 2 files changed, 34 insertions(+), 14 deletions(-) create mode 100644 kccq-12-en-US.json diff --git a/README.md b/README.md index e8a82fa1..61b28154 100644 --- a/README.md +++ b/README.md @@ -53,9 +53,7 @@ Based on [FHIR Questionnaire](https://hl7.org/fhir/R4B/questionnaire.html): |item[x]>text|string|-|Primary text for the item| |item[x]>type|code|e.g. "group", "display", "boolean", "decimal", "integer", "date", etc|See [QuestionnaireItemType](https://hl7.org/fhir/R4B/valueset-item-type.html) for available values.| -#### Example - -TODO: Create KCCQ-12 questionnaire using FHIR data format. +You can find an example KCCQ-12 questionnaire in [kccq-12-en-US.json](kccq-12-en-US.json). ## /medications @@ -118,12 +116,26 @@ In this section, we describe all user-related data to be stored. The security ru |dailyRemindersAreActive|boolean|true, false|Decides whether to send out daily reminder messages for this user.| |textNotificationsAreActive|boolean|true, false|Decides whether to send text notifications for this user.| |medicationRemindersAreActive|boolean|true, false|Decides whether to send medication reminder messages for this user.| -|timeZone|string|e.g. "America/Los_Angeles"|The value needs to correspond to an identifier from [TZDB](https://nodatime.org/TimeZones). It must not be an offset to UTC/GMT, since that wouldn't work well with daylight-savings (even if there is no daylight-savings time at that location). Also, don't use common abbreviations like PST, PDT, CEST, etc (they may be ambiguous, e.g. CST).| - -TBD: What happens if the timeZone could not be identified? When would we send out messages? +|timeZone|string|e.g. "America/Los_Angeles"|The value needs to correspond to an identifier from [TZDB](https://nodatime.org/TimeZones). It must not be an offset to UTC/GMT, since that wouldn't work well with daylight-savings (even if there is no daylight-savings time at that location). Also, don't use common abbreviations like PST, PDT, CEST, etc (they may be ambiguous, e.g. CST). If the timeZone is unknown, then "America/Los_Angeles" should be used.| TBD: We might want to group `dailyRemindersAreActive`, `textNotificationsAreActive ` and `medicationRemindersAreActive ` into one object, e.g. `MessagesSettings`. +### /users/$userId$/appointments/$appointmentId$ + +Based on [FHIR Appointment](https://hl7.org/fhir/R4B/appointment.html). + +|Property|Type|Values|Comments| +|-|-|-|-| +|status|[AppointmentStatus](https://hl7.org/fhir/R4B/valueset-appointmentstatus.html)|e.g. "booked"|-| +|created|[DateTime](https://hl7.org/fhir/R4B/datatypes.html#datetime)|| +|start|[Instant](https://hl7.org/fhir/R4B/datatypes.html#instant)|-|-| +|end|[Instant](https://hl7.org/fhir/R4B/datatypes.html#instant)|-|-| +|comment|optional string|-|May not be shown to the patient.| +|patientInstruction|optional string|-|May be shown to the patient.| +|participant|list of CodeableConcept|-|Must contain at least one element.| +|participant[x]>actor|Reference(Patient)|-|Usually just the `userId` of the patient.| +|participant[x]>status|[ParticipationStatus](https://hl7.org/fhir/R4B/valueset-participationstatus.html)|e.g. accepted, declined, tentative, needs-action|-| + ### /users/$userId$/devices/$deviceId$ This data is required to send push notifications over the [Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging) System. @@ -156,11 +168,21 @@ A device may receive a different notification token at any time though. Therefor |type|optional string|e.g. "questionnaireReminder"|Some messages are sent out on a regular basis, where only the most recent message is really relevant for the patient (e.g. a reminder for a questionnaire). With this property, we can easily find existing messages of the same type and replace them with a new one, if necessary.| |title|LocalizedText|e.g. "Watch Welcome Video in Education Page."|May be localized.| |description|optional LocalizedText|e.g. "The video shows how you will be able to use this app."|May be localized.| -|action|optional string|e.g. "engage-hf:/videoSections/engage-hf/videos/welcome"|See "Available message actions".| +|action|optional string|e.g. "engage-hf:/videoSections/engage-hf/videos/welcome"|See "Message types".| -#### Available message actions +#### Message types -TODO: This subsection shall describe the format of actions to be performed by the clients on tap of a message. +|Type|Trigger|Expiration|Action| +|-|-|-|-| +|MedicationChange|Server: /users/$userId$/medicationRequests changed for a given user. Maximum 1 per day.|Tap|/videoSections/$videoSectionId$/videos/$videoId$| +|WeightGain|Server: New body weight observation received with 3 lbs increase over prior week's median. Do not trigger again for 7 days.|Tap|/medications| +|MedicationUptitration|Server:|Tap|/medications| +|Welcome|Server: When creating new user.|Video start? TBD: Tap?|/videoSections/$videoSectionId$/videos/$videoId$| +|Vitals|Server: Daily at certain time (respect timezone!)|When receiving blood pressure and weight measurements on the server from current day.|/measurements| +|SymptomQuestionnaire|Server: Every 14 days.|After questionnaire responses received on server.|/questionnaires/$questionnaireId$| +|PreVisit|Server: Day (24h) before visit.|After visit time or when visit is cancelled.|/healthSummary| + +TBD: Should we really inform the patient about being eligible for medication uptitration or weight gain? I assume that the algorithms shouldn't themselves decide how to change medication for the patient, so wouldn't it make more sense to inform the clinicians instead and then trigger a MedicationChange later on, if they decide to change the meds? ### /users/$userId$/allergyIntolerances/$allergyIntoleranceId$ @@ -197,15 +219,12 @@ The `dosageInstruction` property may contain values containing the following pro |timing|optional [Timing](https://hl7.org/fhir/R4B/datatypes.html#timing)|-|When medication should be administered| |doseAndRate|list of Element|-|Amount of medication administered| |doseAndRate>type|optional [DoseRateType](https://hl7.org/fhir/R4B/codesystem-dose-rate-type.html)|e.g. "calculated", "ordered"|| -|doseAndRate>dose|optional [Range](https://hl7.org/fhir/R4B/datatypes.html#Range) or [SimpleQuantity](https://hl7.org/fhir/R4B/datatypes.html#SimpleQuantity)|-|-| -|doseAndRate>rate|optional [Ratio](https://build.fhir.org/datatypes.html#ratio) or [Range](https://hl7.org/fhir/R4B/datatypes.html#Range) or [SimpleQuantity](https://hl7.org/fhir/R4B/datatypes.html#SimpleQuantity)|-|-| +|doseAndRate>dose|optional [SimpleQuantity](https://hl7.org/fhir/R4B/datatypes.html#SimpleQuantity)|-|TBD: We should either use "pills" or some weight unit here.| |maxDosePerPeriod|optional [Ratio](https://build.fhir.org/datatypes.html#ratio)|-|Upper limit on medication per unit of time| |maxDosePerAdministration|optional [SimpleQuantity](https://build.fhir.org/datatypes.html#SimpleQuantity)|-|Upper limit on medication per administration| |maxDosePerLifetime|optional [SimpleQuantity](https://build.fhir.org/datatypes.html#SimpleQuantity)|-|Upper limit on medication per unit of time| -TBD: Do we need to be able to specify rate vs dose? i.e. are there scenarios where a clinician would like to just specify "take this amount in this time" rather than "take one pill every evening"? - -TBD: Which timings, doses and rates does the system need to be able to work with? How does this differ between input and processing (e.g. an algorithm might only be interested in the total amount administered per day/week)? +There may be up to three intakes per day (morning, mid-day and evening) with either 0.5, 1 or 2 pills. The dosages should always be grouped by medication, i.e. there should not be multiple medication elements concerning the same medication but different dosage instructions. Instead, one medication element shall be used for that medication with multiple dosage instructions. ### /users/$userId$/observations/$observationId$ diff --git a/kccq-12-en-US.json b/kccq-12-en-US.json new file mode 100644 index 00000000..2355bc22 --- /dev/null +++ b/kccq-12-en-US.json @@ -0,0 +1 @@ +{"title":"KCCQ-12","resourceType":"Questionnaire","language":"en-US","status":"draft","publisher":"Stanford Biodesign Digital Health","meta":{"profile":["http://spezi.health/fhir/StructureDefinition/sdf-Questionnaire"],"tag":[{"system":"urn:ietf:bcp:47","code":"en-US","display":"English"}]},"useContext":[{"code":{"system":"http://hl7.org/fhir/ValueSet/usage-context-type","code":"focus","display":"Clinical Focus"},"valueCodeableConcept":{"coding":[{"system":"urn:oid:2.16.578.1.12.4.1.1.8655","display":"KCCQ-12"}]}}],"contact":[{"name":"http://spezi.health"}],"subjectType":["Patient"],"url":"http://spezi.health/fhir/questionnaire/9528ccc2-d1be-4c4c-9c3c-19f78e51ec19","item":[{"linkId":"73490535-203f-44b2-d1b7-7c0a786c16f9","type":"display","text":"The following questions refer to your heart failure and how it may affect your life. Please read and complete the following questions. There are no right or wrong answers. Please mark the answer that best applies to you.\n\nThese results will be send to your care team.","required":false},{"linkId":"c0b3bef6-1e2d-4621-d82e-b73069574dc4","type":"group","item":[{"linkId":"a459b804-35bf-4792-f1eb-0b52c4e176e1","type":"choice","text":"Showering/bathing","required":true,"answerOption":[{"valueCoding":{"id":"c973b297-4561-4b8c-c8c6-fb559ca15169","code":"1","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Extremely Limited"}},{"valueCoding":{"id":"1a8c0f4f-12a7-458d-8881-0a0750117ff0","code":"2","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Quite a bit Limited"}},{"valueCoding":{"id":"1e372729-1834-41c4-8cda-9a8196a77971","code":"3","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Moderately Limited"}},{"valueCoding":{"id":"cb3c686a-42a0-4c68-8b8d-f2621129adef","code":"4","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Slightly Limited"}},{"valueCoding":{"id":"4c04162f-e529-406b-a0fa-d636ad1bf6d7","code":"5","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Not at all Limited"}},{"valueCoding":{"id":"c4f351f5-33d6-477a-f9ba-f68a1ae0df6d","code":"6","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Limited for other reasons or did not do the activity"}}]},{"linkId":"cf9c5031-1ed5-438a-fc7d-dc69234015a0","type":"choice","text":"Walking 1 block on level ground","required":true,"answerOption":[{"valueCoding":{"id":"c973b297-4561-4b8c-c8c6-fb559ca15169","code":"1","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Extremely Limited"}},{"valueCoding":{"id":"1a8c0f4f-12a7-458d-8881-0a0750117ff0","code":"2","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Quite a bit Limited"}},{"valueCoding":{"id":"1e372729-1834-41c4-8cda-9a8196a77971","code":"3","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Moderately Limited"}},{"valueCoding":{"id":"cb3c686a-42a0-4c68-8b8d-f2621129adef","code":"4","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Slightly Limited"}},{"valueCoding":{"id":"4c04162f-e529-406b-a0fa-d636ad1bf6d7","code":"5","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Not at all Limited"}},{"valueCoding":{"id":"c4f351f5-33d6-477a-f9ba-f68a1ae0df6d","code":"6","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Limited for other reasons or did not do the activity"}}]},{"linkId":"1fad0f81-b2a9-4c8f-9a78-4b2a5d7aef07","type":"choice","text":"Hurrying or jogging (as if to catch a bus)","required":true,"answerOption":[{"valueCoding":{"id":"c973b297-4561-4b8c-c8c6-fb559ca15169","code":"1","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Extremely Limited"}},{"valueCoding":{"id":"1a8c0f4f-12a7-458d-8881-0a0750117ff0","code":"2","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Quite a bit Limited"}},{"valueCoding":{"id":"1e372729-1834-41c4-8cda-9a8196a77971","code":"3","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Moderately Limited"}},{"valueCoding":{"id":"cb3c686a-42a0-4c68-8b8d-f2621129adef","code":"4","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Slightly Limited"}},{"valueCoding":{"id":"4c04162f-e529-406b-a0fa-d636ad1bf6d7","code":"5","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Not at all Limited"}},{"valueCoding":{"id":"c4f351f5-33d6-477a-f9ba-f68a1ae0df6d","code":"6","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Limited for other reasons or did not do the activity"}}]}],"required":false,"text":"Heart failure affects different people in different ways. Some feel shortness of breath while others feel fatigue. Please indicate how much you are limited by heart failure (shortness of breath or fatigue) in your ability to do the following activities over the past 2 weeks."},{"linkId":"692bda7d-a616-43d1-8dc6-8291f6460ab2","type":"choice","text":"Over the past 2 weeks, how many times did you have swelling in your feet, ankles or legs when you woke up in the morning?","required":true,"answerOption":[{"valueCoding":{"id":"80df26e0-55a6-4d50-90de-b60cd851c4fb","code":"1","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Every morning"}},{"valueCoding":{"id":"473f99f2-b9d2-4e92-85ed-ca78f3e0141c","code":"2","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"3 or more times per week but not every day"}},{"valueCoding":{"id":"e3eab124-44f9-43a4-b1f6-e42b0199e39b","code":"3","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"1-2 times per week"}},{"valueCoding":{"id":"253f487a-f26b-442f-8757-8a2401465fed","code":"4","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Less than once a week"}},{"valueCoding":{"id":"7de45367-76b2-4b9b-8e4e-050bae6b309c","code":"5","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Never over the past 2 weeks"}}]},{"linkId":"b1734b9e-1d16-4238-8556-5ae3fa0ba913","type":"choice","text":"Over the past 2 weeks, on average, how many times has fatigue limited your ability to do what you wanted","required":true,"answerOption":[{"valueCoding":{"id":"80df26e0-55a6-4d50-90de-b60cd851c4fb","code":"1","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"All of the time"}},{"valueCoding":{"id":"473f99f2-b9d2-4e92-85ed-ca78f3e0141c","code":"2","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Several times per day"}},{"valueCoding":{"id":"e3eab124-44f9-43a4-b1f6-e42b0199e39b","code":"3","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"At least once a day"}},{"valueCoding":{"id":"253f487a-f26b-442f-8757-8a2401465fed","code":"4","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"3 or more times per week but not every day"}},{"valueCoding":{"id":"7de45367-76b2-4b9b-8e4e-050bae6b309c","code":"5","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"1-2 times per week"}},{"valueCoding":{"id":"e174ffbc-23d4-4c44-94c5-1864bf2afa18","code":"6","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Less than once a week"}},{"valueCoding":{"id":"853fb552-dd2c-48f6-86b9-1bb923d7fd2d","code":"7","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Never over the past 2 weeks"}}]},{"linkId":"57f37fb3-a0ad-4b1f-844e-3f67d9b76946","type":"choice","text":"Over the past 2 weeks, on average, how many times has shortness of breath limited your ability to do what you wanted","required":true,"answerOption":[{"valueCoding":{"id":"80df26e0-55a6-4d50-90de-b60cd851c4fb","code":"1","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"All of the time"}},{"valueCoding":{"id":"473f99f2-b9d2-4e92-85ed-ca78f3e0141c","code":"2","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Several times per day"}},{"valueCoding":{"id":"e3eab124-44f9-43a4-b1f6-e42b0199e39b","code":"3","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"At least once a day"}},{"valueCoding":{"id":"253f487a-f26b-442f-8757-8a2401465fed","code":"4","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"3 or more times per week but not every day"}},{"valueCoding":{"id":"7de45367-76b2-4b9b-8e4e-050bae6b309c","code":"5","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"1-2 times per week"}},{"valueCoding":{"id":"e174ffbc-23d4-4c44-94c5-1864bf2afa18","code":"6","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Less than once a week"}},{"valueCoding":{"id":"853fb552-dd2c-48f6-86b9-1bb923d7fd2d","code":"7","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Never over the past 2 weeks"}}]},{"linkId":"396164df-d045-4c56-d710-513297bdc6f2","type":"choice","text":"Over the past 2 weeks, on average, how many times have you been forced to sleep sitting up in a chair or with at least 3 pillows to prop you up because of shortness of breath?","required":true,"answerOption":[{"valueCoding":{"id":"80df26e0-55a6-4d50-90de-b60cd851c4fb","code":"1","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Every night"}},{"valueCoding":{"id":"473f99f2-b9d2-4e92-85ed-ca78f3e0141c","code":"2","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"3 or more times per week but not every day"}},{"valueCoding":{"id":"e3eab124-44f9-43a4-b1f6-e42b0199e39b","code":"3","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"1-2 times per week"}},{"valueCoding":{"id":"253f487a-f26b-442f-8757-8a2401465fed","code":"4","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Less than once a week"}},{"valueCoding":{"id":"7de45367-76b2-4b9b-8e4e-050bae6b309c","code":"5","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Never over the past 2 weeks"}}]},{"linkId":"75e3f62e-e37d-48a2-f4d9-af2db8922da0","type":"choice","text":"Over the past 2 weeks, how much has your heart failure limited your enjoyment of life?","required":true,"answerOption":[{"valueCoding":{"id":"80df26e0-55a6-4d50-90de-b60cd851c4fb","code":"1","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"It has extremely limited my enjoyment of life"}},{"valueCoding":{"id":"473f99f2-b9d2-4e92-85ed-ca78f3e0141c","code":"2","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"It has limited my enjoyment of life quite a bit"}},{"valueCoding":{"id":"e3eab124-44f9-43a4-b1f6-e42b0199e39b","code":"3","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"It has moderately limited my enjoyment of life"}},{"valueCoding":{"id":"253f487a-f26b-442f-8757-8a2401465fed","code":"4","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"It has slightly limited my enjoyment of life"}},{"valueCoding":{"id":"7de45367-76b2-4b9b-8e4e-050bae6b309c","code":"5","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"It has not limited my enjoyment of life"}}]},{"linkId":"fce3a16e-c6d8-4bac-8ab5-8f4aee4adc08","type":"choice","text":"If you had to spend the rest of your life with your heart failure the way it is right now, how would you feel about this?","required":true,"answerOption":[{"valueCoding":{"id":"80df26e0-55a6-4d50-90de-b60cd851c4fb","code":"1","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Not at all satisfied"}},{"valueCoding":{"id":"473f99f2-b9d2-4e92-85ed-ca78f3e0141c","code":"2","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Mostly dissatisfied"}},{"valueCoding":{"id":"e3eab124-44f9-43a4-b1f6-e42b0199e39b","code":"3","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Somewhat satisfied"}},{"valueCoding":{"id":"253f487a-f26b-442f-8757-8a2401465fed","code":"4","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Mostly satisfied"}},{"valueCoding":{"id":"7de45367-76b2-4b9b-8e4e-050bae6b309c","code":"5","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Completely satisfied"}}]},{"linkId":"8649bc8c-f908-487d-87a4-a97106b1a4c3","type":"group","item":[{"linkId":"8b022e69-127d-4447-8190-39ac645e60e1","type":"choice","text":"Hobbies, recreational activities","required":true,"answerOption":[{"valueCoding":{"id":"5df54746-3a58-4153-8f07-1f13fdc09902","code":"1","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Severely Limited"}},{"valueCoding":{"id":"a57b3a46-a005-4204-a07f-b2d535a6d5ab","code":"2","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Limited quite a bit"}},{"valueCoding":{"id":"632d08fb-b521-4511-8887-b7c375d901f3","code":"3","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Moderately limited"}},{"valueCoding":{"id":"fcbe715a-b86c-4fdc-8855-8aaa353d06d7","code":"4","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Slightly limited"}},{"valueCoding":{"id":"d9cf6b00-5fed-48ac-a2be-a2e29688c5fa","code":"5","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Did not limit at all"}},{"valueCoding":{"id":"8a20b488-aad4-4676-86d3-c494b979db3f","code":"6","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Does not apply or did not do for other reasons"}}]},{"linkId":"1eee7259-da1c-4cba-80a9-e67e684573a1","type":"choice","text":"Working or doing household chores","required":true,"answerOption":[{"valueCoding":{"id":"5df54746-3a58-4153-8f07-1f13fdc09902","code":"1","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Severely Limited"}},{"valueCoding":{"id":"a57b3a46-a005-4204-a07f-b2d535a6d5ab","code":"2","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Limited quite a bit"}},{"valueCoding":{"id":"632d08fb-b521-4511-8887-b7c375d901f3","code":"3","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Moderately limited"}},{"valueCoding":{"id":"fcbe715a-b86c-4fdc-8855-8aaa353d06d7","code":"4","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Slightly limited"}},{"valueCoding":{"id":"d9cf6b00-5fed-48ac-a2be-a2e29688c5fa","code":"5","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Did not limit at all"}},{"valueCoding":{"id":"8a20b488-aad4-4676-86d3-c494b979db3f","code":"6","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Does not apply or did not do for other reasons"}}]},{"linkId":"883a22a8-2f6e-4b41-84b7-0028ed543192","type":"choice","text":"Visiting family or friends out of your home","required":true,"answerOption":[{"valueCoding":{"id":"5df54746-3a58-4153-8f07-1f13fdc09902","code":"1","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Severely Limited"}},{"valueCoding":{"id":"a57b3a46-a005-4204-a07f-b2d535a6d5ab","code":"2","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Limited quite a bit"}},{"valueCoding":{"id":"632d08fb-b521-4511-8887-b7c375d901f3","code":"3","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Moderately limited"}},{"valueCoding":{"id":"fcbe715a-b86c-4fdc-8855-8aaa353d06d7","code":"4","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Slightly limited"}},{"valueCoding":{"id":"d9cf6b00-5fed-48ac-a2be-a2e29688c5fa","code":"5","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Did not limit at all"}},{"valueCoding":{"id":"8a20b488-aad4-4676-86d3-c494b979db3f","code":"6","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Does not apply or did not do for other reasons"}}]}],"required":false,"text":"How much does your heart failure affect your lifestyle? Please indicate how your heart failure may have limited your participation in the following activities over the past 2 weeks."},{"linkId":"24108967-2ff3-40d0-c54f-a7b97bb84d05","type":"choice","text":"In the last two weeks, how much has your dizziness affected you?","required":true,"answerOption":[{"valueCoding":{"id":"80df26e0-55a6-4d50-90de-b60cd851c4fb","code":"1","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Extremely bothersome"}},{"valueCoding":{"id":"473f99f2-b9d2-4e92-85ed-ca78f3e0141c","code":"2","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Quite a bit bothersome"}},{"valueCoding":{"id":"e3eab124-44f9-43a4-b1f6-e42b0199e39b","code":"3","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Moderately bothersome"}},{"valueCoding":{"id":"253f487a-f26b-442f-8757-8a2401465fed","code":"4","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Slightly bothersome"}},{"valueCoding":{"id":"7de45367-76b2-4b9b-8e4e-050bae6b309c","code":"5","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Not at all bothersome"}},{"valueCoding":{"id":"3d1a8f9b-e666-4ad4-9202-571313a2b5d1","code":"6","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"I've had no dizziness"}}]}]} \ No newline at end of file From 00bab697c7f9838a02b769ffd36e975effdfba48 Mon Sep 17 00:00:00 2001 From: Paul Kraft Date: Wed, 12 Jun 2024 15:21:43 +0200 Subject: [PATCH 12/15] Beautify kccq-12-en-US.json --- kccq-12-en-US.json | 782 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 781 insertions(+), 1 deletion(-) diff --git a/kccq-12-en-US.json b/kccq-12-en-US.json index 2355bc22..af60539c 100644 --- a/kccq-12-en-US.json +++ b/kccq-12-en-US.json @@ -1 +1,781 @@ -{"title":"KCCQ-12","resourceType":"Questionnaire","language":"en-US","status":"draft","publisher":"Stanford Biodesign Digital Health","meta":{"profile":["http://spezi.health/fhir/StructureDefinition/sdf-Questionnaire"],"tag":[{"system":"urn:ietf:bcp:47","code":"en-US","display":"English"}]},"useContext":[{"code":{"system":"http://hl7.org/fhir/ValueSet/usage-context-type","code":"focus","display":"Clinical Focus"},"valueCodeableConcept":{"coding":[{"system":"urn:oid:2.16.578.1.12.4.1.1.8655","display":"KCCQ-12"}]}}],"contact":[{"name":"http://spezi.health"}],"subjectType":["Patient"],"url":"http://spezi.health/fhir/questionnaire/9528ccc2-d1be-4c4c-9c3c-19f78e51ec19","item":[{"linkId":"73490535-203f-44b2-d1b7-7c0a786c16f9","type":"display","text":"The following questions refer to your heart failure and how it may affect your life. Please read and complete the following questions. There are no right or wrong answers. Please mark the answer that best applies to you.\n\nThese results will be send to your care team.","required":false},{"linkId":"c0b3bef6-1e2d-4621-d82e-b73069574dc4","type":"group","item":[{"linkId":"a459b804-35bf-4792-f1eb-0b52c4e176e1","type":"choice","text":"Showering/bathing","required":true,"answerOption":[{"valueCoding":{"id":"c973b297-4561-4b8c-c8c6-fb559ca15169","code":"1","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Extremely Limited"}},{"valueCoding":{"id":"1a8c0f4f-12a7-458d-8881-0a0750117ff0","code":"2","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Quite a bit Limited"}},{"valueCoding":{"id":"1e372729-1834-41c4-8cda-9a8196a77971","code":"3","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Moderately Limited"}},{"valueCoding":{"id":"cb3c686a-42a0-4c68-8b8d-f2621129adef","code":"4","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Slightly Limited"}},{"valueCoding":{"id":"4c04162f-e529-406b-a0fa-d636ad1bf6d7","code":"5","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Not at all Limited"}},{"valueCoding":{"id":"c4f351f5-33d6-477a-f9ba-f68a1ae0df6d","code":"6","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Limited for other reasons or did not do the activity"}}]},{"linkId":"cf9c5031-1ed5-438a-fc7d-dc69234015a0","type":"choice","text":"Walking 1 block on level ground","required":true,"answerOption":[{"valueCoding":{"id":"c973b297-4561-4b8c-c8c6-fb559ca15169","code":"1","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Extremely Limited"}},{"valueCoding":{"id":"1a8c0f4f-12a7-458d-8881-0a0750117ff0","code":"2","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Quite a bit Limited"}},{"valueCoding":{"id":"1e372729-1834-41c4-8cda-9a8196a77971","code":"3","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Moderately Limited"}},{"valueCoding":{"id":"cb3c686a-42a0-4c68-8b8d-f2621129adef","code":"4","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Slightly Limited"}},{"valueCoding":{"id":"4c04162f-e529-406b-a0fa-d636ad1bf6d7","code":"5","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Not at all Limited"}},{"valueCoding":{"id":"c4f351f5-33d6-477a-f9ba-f68a1ae0df6d","code":"6","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Limited for other reasons or did not do the activity"}}]},{"linkId":"1fad0f81-b2a9-4c8f-9a78-4b2a5d7aef07","type":"choice","text":"Hurrying or jogging (as if to catch a bus)","required":true,"answerOption":[{"valueCoding":{"id":"c973b297-4561-4b8c-c8c6-fb559ca15169","code":"1","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Extremely Limited"}},{"valueCoding":{"id":"1a8c0f4f-12a7-458d-8881-0a0750117ff0","code":"2","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Quite a bit Limited"}},{"valueCoding":{"id":"1e372729-1834-41c4-8cda-9a8196a77971","code":"3","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Moderately Limited"}},{"valueCoding":{"id":"cb3c686a-42a0-4c68-8b8d-f2621129adef","code":"4","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Slightly Limited"}},{"valueCoding":{"id":"4c04162f-e529-406b-a0fa-d636ad1bf6d7","code":"5","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Not at all Limited"}},{"valueCoding":{"id":"c4f351f5-33d6-477a-f9ba-f68a1ae0df6d","code":"6","system":"urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14","display":"Limited for other reasons or did not do the activity"}}]}],"required":false,"text":"Heart failure affects different people in different ways. Some feel shortness of breath while others feel fatigue. Please indicate how much you are limited by heart failure (shortness of breath or fatigue) in your ability to do the following activities over the past 2 weeks."},{"linkId":"692bda7d-a616-43d1-8dc6-8291f6460ab2","type":"choice","text":"Over the past 2 weeks, how many times did you have swelling in your feet, ankles or legs when you woke up in the morning?","required":true,"answerOption":[{"valueCoding":{"id":"80df26e0-55a6-4d50-90de-b60cd851c4fb","code":"1","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Every morning"}},{"valueCoding":{"id":"473f99f2-b9d2-4e92-85ed-ca78f3e0141c","code":"2","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"3 or more times per week but not every day"}},{"valueCoding":{"id":"e3eab124-44f9-43a4-b1f6-e42b0199e39b","code":"3","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"1-2 times per week"}},{"valueCoding":{"id":"253f487a-f26b-442f-8757-8a2401465fed","code":"4","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Less than once a week"}},{"valueCoding":{"id":"7de45367-76b2-4b9b-8e4e-050bae6b309c","code":"5","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Never over the past 2 weeks"}}]},{"linkId":"b1734b9e-1d16-4238-8556-5ae3fa0ba913","type":"choice","text":"Over the past 2 weeks, on average, how many times has fatigue limited your ability to do what you wanted","required":true,"answerOption":[{"valueCoding":{"id":"80df26e0-55a6-4d50-90de-b60cd851c4fb","code":"1","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"All of the time"}},{"valueCoding":{"id":"473f99f2-b9d2-4e92-85ed-ca78f3e0141c","code":"2","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Several times per day"}},{"valueCoding":{"id":"e3eab124-44f9-43a4-b1f6-e42b0199e39b","code":"3","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"At least once a day"}},{"valueCoding":{"id":"253f487a-f26b-442f-8757-8a2401465fed","code":"4","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"3 or more times per week but not every day"}},{"valueCoding":{"id":"7de45367-76b2-4b9b-8e4e-050bae6b309c","code":"5","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"1-2 times per week"}},{"valueCoding":{"id":"e174ffbc-23d4-4c44-94c5-1864bf2afa18","code":"6","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Less than once a week"}},{"valueCoding":{"id":"853fb552-dd2c-48f6-86b9-1bb923d7fd2d","code":"7","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Never over the past 2 weeks"}}]},{"linkId":"57f37fb3-a0ad-4b1f-844e-3f67d9b76946","type":"choice","text":"Over the past 2 weeks, on average, how many times has shortness of breath limited your ability to do what you wanted","required":true,"answerOption":[{"valueCoding":{"id":"80df26e0-55a6-4d50-90de-b60cd851c4fb","code":"1","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"All of the time"}},{"valueCoding":{"id":"473f99f2-b9d2-4e92-85ed-ca78f3e0141c","code":"2","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Several times per day"}},{"valueCoding":{"id":"e3eab124-44f9-43a4-b1f6-e42b0199e39b","code":"3","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"At least once a day"}},{"valueCoding":{"id":"253f487a-f26b-442f-8757-8a2401465fed","code":"4","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"3 or more times per week but not every day"}},{"valueCoding":{"id":"7de45367-76b2-4b9b-8e4e-050bae6b309c","code":"5","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"1-2 times per week"}},{"valueCoding":{"id":"e174ffbc-23d4-4c44-94c5-1864bf2afa18","code":"6","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Less than once a week"}},{"valueCoding":{"id":"853fb552-dd2c-48f6-86b9-1bb923d7fd2d","code":"7","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Never over the past 2 weeks"}}]},{"linkId":"396164df-d045-4c56-d710-513297bdc6f2","type":"choice","text":"Over the past 2 weeks, on average, how many times have you been forced to sleep sitting up in a chair or with at least 3 pillows to prop you up because of shortness of breath?","required":true,"answerOption":[{"valueCoding":{"id":"80df26e0-55a6-4d50-90de-b60cd851c4fb","code":"1","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Every night"}},{"valueCoding":{"id":"473f99f2-b9d2-4e92-85ed-ca78f3e0141c","code":"2","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"3 or more times per week but not every day"}},{"valueCoding":{"id":"e3eab124-44f9-43a4-b1f6-e42b0199e39b","code":"3","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"1-2 times per week"}},{"valueCoding":{"id":"253f487a-f26b-442f-8757-8a2401465fed","code":"4","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Less than once a week"}},{"valueCoding":{"id":"7de45367-76b2-4b9b-8e4e-050bae6b309c","code":"5","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Never over the past 2 weeks"}}]},{"linkId":"75e3f62e-e37d-48a2-f4d9-af2db8922da0","type":"choice","text":"Over the past 2 weeks, how much has your heart failure limited your enjoyment of life?","required":true,"answerOption":[{"valueCoding":{"id":"80df26e0-55a6-4d50-90de-b60cd851c4fb","code":"1","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"It has extremely limited my enjoyment of life"}},{"valueCoding":{"id":"473f99f2-b9d2-4e92-85ed-ca78f3e0141c","code":"2","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"It has limited my enjoyment of life quite a bit"}},{"valueCoding":{"id":"e3eab124-44f9-43a4-b1f6-e42b0199e39b","code":"3","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"It has moderately limited my enjoyment of life"}},{"valueCoding":{"id":"253f487a-f26b-442f-8757-8a2401465fed","code":"4","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"It has slightly limited my enjoyment of life"}},{"valueCoding":{"id":"7de45367-76b2-4b9b-8e4e-050bae6b309c","code":"5","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"It has not limited my enjoyment of life"}}]},{"linkId":"fce3a16e-c6d8-4bac-8ab5-8f4aee4adc08","type":"choice","text":"If you had to spend the rest of your life with your heart failure the way it is right now, how would you feel about this?","required":true,"answerOption":[{"valueCoding":{"id":"80df26e0-55a6-4d50-90de-b60cd851c4fb","code":"1","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Not at all satisfied"}},{"valueCoding":{"id":"473f99f2-b9d2-4e92-85ed-ca78f3e0141c","code":"2","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Mostly dissatisfied"}},{"valueCoding":{"id":"e3eab124-44f9-43a4-b1f6-e42b0199e39b","code":"3","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Somewhat satisfied"}},{"valueCoding":{"id":"253f487a-f26b-442f-8757-8a2401465fed","code":"4","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Mostly satisfied"}},{"valueCoding":{"id":"7de45367-76b2-4b9b-8e4e-050bae6b309c","code":"5","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Completely satisfied"}}]},{"linkId":"8649bc8c-f908-487d-87a4-a97106b1a4c3","type":"group","item":[{"linkId":"8b022e69-127d-4447-8190-39ac645e60e1","type":"choice","text":"Hobbies, recreational activities","required":true,"answerOption":[{"valueCoding":{"id":"5df54746-3a58-4153-8f07-1f13fdc09902","code":"1","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Severely Limited"}},{"valueCoding":{"id":"a57b3a46-a005-4204-a07f-b2d535a6d5ab","code":"2","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Limited quite a bit"}},{"valueCoding":{"id":"632d08fb-b521-4511-8887-b7c375d901f3","code":"3","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Moderately limited"}},{"valueCoding":{"id":"fcbe715a-b86c-4fdc-8855-8aaa353d06d7","code":"4","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Slightly limited"}},{"valueCoding":{"id":"d9cf6b00-5fed-48ac-a2be-a2e29688c5fa","code":"5","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Did not limit at all"}},{"valueCoding":{"id":"8a20b488-aad4-4676-86d3-c494b979db3f","code":"6","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Does not apply or did not do for other reasons"}}]},{"linkId":"1eee7259-da1c-4cba-80a9-e67e684573a1","type":"choice","text":"Working or doing household chores","required":true,"answerOption":[{"valueCoding":{"id":"5df54746-3a58-4153-8f07-1f13fdc09902","code":"1","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Severely Limited"}},{"valueCoding":{"id":"a57b3a46-a005-4204-a07f-b2d535a6d5ab","code":"2","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Limited quite a bit"}},{"valueCoding":{"id":"632d08fb-b521-4511-8887-b7c375d901f3","code":"3","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Moderately limited"}},{"valueCoding":{"id":"fcbe715a-b86c-4fdc-8855-8aaa353d06d7","code":"4","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Slightly limited"}},{"valueCoding":{"id":"d9cf6b00-5fed-48ac-a2be-a2e29688c5fa","code":"5","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Did not limit at all"}},{"valueCoding":{"id":"8a20b488-aad4-4676-86d3-c494b979db3f","code":"6","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Does not apply or did not do for other reasons"}}]},{"linkId":"883a22a8-2f6e-4b41-84b7-0028ed543192","type":"choice","text":"Visiting family or friends out of your home","required":true,"answerOption":[{"valueCoding":{"id":"5df54746-3a58-4153-8f07-1f13fdc09902","code":"1","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Severely Limited"}},{"valueCoding":{"id":"a57b3a46-a005-4204-a07f-b2d535a6d5ab","code":"2","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Limited quite a bit"}},{"valueCoding":{"id":"632d08fb-b521-4511-8887-b7c375d901f3","code":"3","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Moderately limited"}},{"valueCoding":{"id":"fcbe715a-b86c-4fdc-8855-8aaa353d06d7","code":"4","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Slightly limited"}},{"valueCoding":{"id":"d9cf6b00-5fed-48ac-a2be-a2e29688c5fa","code":"5","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Did not limit at all"}},{"valueCoding":{"id":"8a20b488-aad4-4676-86d3-c494b979db3f","code":"6","system":"urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf","display":"Does not apply or did not do for other reasons"}}]}],"required":false,"text":"How much does your heart failure affect your lifestyle? Please indicate how your heart failure may have limited your participation in the following activities over the past 2 weeks."},{"linkId":"24108967-2ff3-40d0-c54f-a7b97bb84d05","type":"choice","text":"In the last two weeks, how much has your dizziness affected you?","required":true,"answerOption":[{"valueCoding":{"id":"80df26e0-55a6-4d50-90de-b60cd851c4fb","code":"1","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Extremely bothersome"}},{"valueCoding":{"id":"473f99f2-b9d2-4e92-85ed-ca78f3e0141c","code":"2","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Quite a bit bothersome"}},{"valueCoding":{"id":"e3eab124-44f9-43a4-b1f6-e42b0199e39b","code":"3","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Moderately bothersome"}},{"valueCoding":{"id":"253f487a-f26b-442f-8757-8a2401465fed","code":"4","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Slightly bothersome"}},{"valueCoding":{"id":"7de45367-76b2-4b9b-8e4e-050bae6b309c","code":"5","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"Not at all bothersome"}},{"valueCoding":{"id":"3d1a8f9b-e666-4ad4-9202-571313a2b5d1","code":"6","system":"urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2","display":"I've had no dizziness"}}]}]} \ No newline at end of file +{ + "title": "KCCQ-12", + "resourceType": "Questionnaire", + "language": "en-US", + "status": "draft", + "publisher": "Stanford Biodesign Digital Health", + "meta": { + "profile": [ + "http://spezi.health/fhir/StructureDefinition/sdf-Questionnaire" + ], + "tag": [ + { + "system": "urn:ietf:bcp:47", + "code": "en-US", + "display": "English" + } + ] + }, + "useContext": [ + { + "code": { + "system": "http://hl7.org/fhir/ValueSet/usage-context-type", + "code": "focus", + "display": "Clinical Focus" + }, + "valueCodeableConcept": { + "coding": [ + { + "system": "urn:oid:2.16.578.1.12.4.1.1.8655", + "display": "KCCQ-12" + } + ] + } + } + ], + "contact": [ + { + "name": "http://spezi.health" + } + ], + "subjectType": [ + "Patient" + ], + "url": "http://spezi.health/fhir/questionnaire/9528ccc2-d1be-4c4c-9c3c-19f78e51ec19", + "item": [ + { + "linkId": "73490535-203f-44b2-d1b7-7c0a786c16f9", + "type": "display", + "text": "The following questions refer to your heart failure and how it may affect your life. Please read and complete the following questions. There are no right or wrong answers. Please mark the answer that best applies to you.\n\nThese results will be send to your care team.", + "required": false + }, + { + "linkId": "c0b3bef6-1e2d-4621-d82e-b73069574dc4", + "type": "group", + "item": [ + { + "linkId": "a459b804-35bf-4792-f1eb-0b52c4e176e1", + "type": "choice", + "text": "Showering/bathing", + "required": true, + "answerOption": [ + { + "valueCoding": { + "id": "c973b297-4561-4b8c-c8c6-fb559ca15169", + "code": "1", + "system": "urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14", + "display": "Extremely Limited" + } + }, + { + "valueCoding": { + "id": "1a8c0f4f-12a7-458d-8881-0a0750117ff0", + "code": "2", + "system": "urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14", + "display": "Quite a bit Limited" + } + }, + { + "valueCoding": { + "id": "1e372729-1834-41c4-8cda-9a8196a77971", + "code": "3", + "system": "urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14", + "display": "Moderately Limited" + } + }, + { + "valueCoding": { + "id": "cb3c686a-42a0-4c68-8b8d-f2621129adef", + "code": "4", + "system": "urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14", + "display": "Slightly Limited" + } + }, + { + "valueCoding": { + "id": "4c04162f-e529-406b-a0fa-d636ad1bf6d7", + "code": "5", + "system": "urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14", + "display": "Not at all Limited" + } + }, + { + "valueCoding": { + "id": "c4f351f5-33d6-477a-f9ba-f68a1ae0df6d", + "code": "6", + "system": "urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14", + "display": "Limited for other reasons or did not do the activity" + } + } + ] + }, + { + "linkId": "cf9c5031-1ed5-438a-fc7d-dc69234015a0", + "type": "choice", + "text": "Walking 1 block on level ground", + "required": true, + "answerOption": [ + { + "valueCoding": { + "id": "c973b297-4561-4b8c-c8c6-fb559ca15169", + "code": "1", + "system": "urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14", + "display": "Extremely Limited" + } + }, + { + "valueCoding": { + "id": "1a8c0f4f-12a7-458d-8881-0a0750117ff0", + "code": "2", + "system": "urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14", + "display": "Quite a bit Limited" + } + }, + { + "valueCoding": { + "id": "1e372729-1834-41c4-8cda-9a8196a77971", + "code": "3", + "system": "urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14", + "display": "Moderately Limited" + } + }, + { + "valueCoding": { + "id": "cb3c686a-42a0-4c68-8b8d-f2621129adef", + "code": "4", + "system": "urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14", + "display": "Slightly Limited" + } + }, + { + "valueCoding": { + "id": "4c04162f-e529-406b-a0fa-d636ad1bf6d7", + "code": "5", + "system": "urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14", + "display": "Not at all Limited" + } + }, + { + "valueCoding": { + "id": "c4f351f5-33d6-477a-f9ba-f68a1ae0df6d", + "code": "6", + "system": "urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14", + "display": "Limited for other reasons or did not do the activity" + } + } + ] + }, + { + "linkId": "1fad0f81-b2a9-4c8f-9a78-4b2a5d7aef07", + "type": "choice", + "text": "Hurrying or jogging (as if to catch a bus)", + "required": true, + "answerOption": [ + { + "valueCoding": { + "id": "c973b297-4561-4b8c-c8c6-fb559ca15169", + "code": "1", + "system": "urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14", + "display": "Extremely Limited" + } + }, + { + "valueCoding": { + "id": "1a8c0f4f-12a7-458d-8881-0a0750117ff0", + "code": "2", + "system": "urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14", + "display": "Quite a bit Limited" + } + }, + { + "valueCoding": { + "id": "1e372729-1834-41c4-8cda-9a8196a77971", + "code": "3", + "system": "urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14", + "display": "Moderately Limited" + } + }, + { + "valueCoding": { + "id": "cb3c686a-42a0-4c68-8b8d-f2621129adef", + "code": "4", + "system": "urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14", + "display": "Slightly Limited" + } + }, + { + "valueCoding": { + "id": "4c04162f-e529-406b-a0fa-d636ad1bf6d7", + "code": "5", + "system": "urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14", + "display": "Not at all Limited" + } + }, + { + "valueCoding": { + "id": "c4f351f5-33d6-477a-f9ba-f68a1ae0df6d", + "code": "6", + "system": "urn:uuid:8290e1d8-8141-4982-deb9-57f9d2e13a14", + "display": "Limited for other reasons or did not do the activity" + } + } + ] + } + ], + "required": false, + "text": "Heart failure affects different people in different ways. Some feel shortness of breath while others feel fatigue. Please indicate how much you are limited by heart failure (shortness of breath or fatigue) in your ability to do the following activities over the past 2 weeks." + }, + { + "linkId": "692bda7d-a616-43d1-8dc6-8291f6460ab2", + "type": "choice", + "text": "Over the past 2 weeks, how many times did you have swelling in your feet, ankles or legs when you woke up in the morning?", + "required": true, + "answerOption": [ + { + "valueCoding": { + "id": "80df26e0-55a6-4d50-90de-b60cd851c4fb", + "code": "1", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "Every morning" + } + }, + { + "valueCoding": { + "id": "473f99f2-b9d2-4e92-85ed-ca78f3e0141c", + "code": "2", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "3 or more times per week but not every day" + } + }, + { + "valueCoding": { + "id": "e3eab124-44f9-43a4-b1f6-e42b0199e39b", + "code": "3", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "1-2 times per week" + } + }, + { + "valueCoding": { + "id": "253f487a-f26b-442f-8757-8a2401465fed", + "code": "4", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "Less than once a week" + } + }, + { + "valueCoding": { + "id": "7de45367-76b2-4b9b-8e4e-050bae6b309c", + "code": "5", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "Never over the past 2 weeks" + } + } + ] + }, + { + "linkId": "b1734b9e-1d16-4238-8556-5ae3fa0ba913", + "type": "choice", + "text": "Over the past 2 weeks, on average, how many times has fatigue limited your ability to do what you wanted", + "required": true, + "answerOption": [ + { + "valueCoding": { + "id": "80df26e0-55a6-4d50-90de-b60cd851c4fb", + "code": "1", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "All of the time" + } + }, + { + "valueCoding": { + "id": "473f99f2-b9d2-4e92-85ed-ca78f3e0141c", + "code": "2", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "Several times per day" + } + }, + { + "valueCoding": { + "id": "e3eab124-44f9-43a4-b1f6-e42b0199e39b", + "code": "3", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "At least once a day" + } + }, + { + "valueCoding": { + "id": "253f487a-f26b-442f-8757-8a2401465fed", + "code": "4", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "3 or more times per week but not every day" + } + }, + { + "valueCoding": { + "id": "7de45367-76b2-4b9b-8e4e-050bae6b309c", + "code": "5", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "1-2 times per week" + } + }, + { + "valueCoding": { + "id": "e174ffbc-23d4-4c44-94c5-1864bf2afa18", + "code": "6", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "Less than once a week" + } + }, + { + "valueCoding": { + "id": "853fb552-dd2c-48f6-86b9-1bb923d7fd2d", + "code": "7", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "Never over the past 2 weeks" + } + } + ] + }, + { + "linkId": "57f37fb3-a0ad-4b1f-844e-3f67d9b76946", + "type": "choice", + "text": "Over the past 2 weeks, on average, how many times has shortness of breath limited your ability to do what you wanted", + "required": true, + "answerOption": [ + { + "valueCoding": { + "id": "80df26e0-55a6-4d50-90de-b60cd851c4fb", + "code": "1", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "All of the time" + } + }, + { + "valueCoding": { + "id": "473f99f2-b9d2-4e92-85ed-ca78f3e0141c", + "code": "2", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "Several times per day" + } + }, + { + "valueCoding": { + "id": "e3eab124-44f9-43a4-b1f6-e42b0199e39b", + "code": "3", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "At least once a day" + } + }, + { + "valueCoding": { + "id": "253f487a-f26b-442f-8757-8a2401465fed", + "code": "4", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "3 or more times per week but not every day" + } + }, + { + "valueCoding": { + "id": "7de45367-76b2-4b9b-8e4e-050bae6b309c", + "code": "5", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "1-2 times per week" + } + }, + { + "valueCoding": { + "id": "e174ffbc-23d4-4c44-94c5-1864bf2afa18", + "code": "6", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "Less than once a week" + } + }, + { + "valueCoding": { + "id": "853fb552-dd2c-48f6-86b9-1bb923d7fd2d", + "code": "7", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "Never over the past 2 weeks" + } + } + ] + }, + { + "linkId": "396164df-d045-4c56-d710-513297bdc6f2", + "type": "choice", + "text": "Over the past 2 weeks, on average, how many times have you been forced to sleep sitting up in a chair or with at least 3 pillows to prop you up because of shortness of breath?", + "required": true, + "answerOption": [ + { + "valueCoding": { + "id": "80df26e0-55a6-4d50-90de-b60cd851c4fb", + "code": "1", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "Every night" + } + }, + { + "valueCoding": { + "id": "473f99f2-b9d2-4e92-85ed-ca78f3e0141c", + "code": "2", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "3 or more times per week but not every day" + } + }, + { + "valueCoding": { + "id": "e3eab124-44f9-43a4-b1f6-e42b0199e39b", + "code": "3", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "1-2 times per week" + } + }, + { + "valueCoding": { + "id": "253f487a-f26b-442f-8757-8a2401465fed", + "code": "4", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "Less than once a week" + } + }, + { + "valueCoding": { + "id": "7de45367-76b2-4b9b-8e4e-050bae6b309c", + "code": "5", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "Never over the past 2 weeks" + } + } + ] + }, + { + "linkId": "75e3f62e-e37d-48a2-f4d9-af2db8922da0", + "type": "choice", + "text": "Over the past 2 weeks, how much has your heart failure limited your enjoyment of life?", + "required": true, + "answerOption": [ + { + "valueCoding": { + "id": "80df26e0-55a6-4d50-90de-b60cd851c4fb", + "code": "1", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "It has extremely limited my enjoyment of life" + } + }, + { + "valueCoding": { + "id": "473f99f2-b9d2-4e92-85ed-ca78f3e0141c", + "code": "2", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "It has limited my enjoyment of life quite a bit" + } + }, + { + "valueCoding": { + "id": "e3eab124-44f9-43a4-b1f6-e42b0199e39b", + "code": "3", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "It has moderately limited my enjoyment of life" + } + }, + { + "valueCoding": { + "id": "253f487a-f26b-442f-8757-8a2401465fed", + "code": "4", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "It has slightly limited my enjoyment of life" + } + }, + { + "valueCoding": { + "id": "7de45367-76b2-4b9b-8e4e-050bae6b309c", + "code": "5", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "It has not limited my enjoyment of life" + } + } + ] + }, + { + "linkId": "fce3a16e-c6d8-4bac-8ab5-8f4aee4adc08", + "type": "choice", + "text": "If you had to spend the rest of your life with your heart failure the way it is right now, how would you feel about this?", + "required": true, + "answerOption": [ + { + "valueCoding": { + "id": "80df26e0-55a6-4d50-90de-b60cd851c4fb", + "code": "1", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "Not at all satisfied" + } + }, + { + "valueCoding": { + "id": "473f99f2-b9d2-4e92-85ed-ca78f3e0141c", + "code": "2", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "Mostly dissatisfied" + } + }, + { + "valueCoding": { + "id": "e3eab124-44f9-43a4-b1f6-e42b0199e39b", + "code": "3", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "Somewhat satisfied" + } + }, + { + "valueCoding": { + "id": "253f487a-f26b-442f-8757-8a2401465fed", + "code": "4", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "Mostly satisfied" + } + }, + { + "valueCoding": { + "id": "7de45367-76b2-4b9b-8e4e-050bae6b309c", + "code": "5", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "Completely satisfied" + } + } + ] + }, + { + "linkId": "8649bc8c-f908-487d-87a4-a97106b1a4c3", + "type": "group", + "item": [ + { + "linkId": "8b022e69-127d-4447-8190-39ac645e60e1", + "type": "choice", + "text": "Hobbies, recreational activities", + "required": true, + "answerOption": [ + { + "valueCoding": { + "id": "5df54746-3a58-4153-8f07-1f13fdc09902", + "code": "1", + "system": "urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf", + "display": "Severely Limited" + } + }, + { + "valueCoding": { + "id": "a57b3a46-a005-4204-a07f-b2d535a6d5ab", + "code": "2", + "system": "urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf", + "display": "Limited quite a bit" + } + }, + { + "valueCoding": { + "id": "632d08fb-b521-4511-8887-b7c375d901f3", + "code": "3", + "system": "urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf", + "display": "Moderately limited" + } + }, + { + "valueCoding": { + "id": "fcbe715a-b86c-4fdc-8855-8aaa353d06d7", + "code": "4", + "system": "urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf", + "display": "Slightly limited" + } + }, + { + "valueCoding": { + "id": "d9cf6b00-5fed-48ac-a2be-a2e29688c5fa", + "code": "5", + "system": "urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf", + "display": "Did not limit at all" + } + }, + { + "valueCoding": { + "id": "8a20b488-aad4-4676-86d3-c494b979db3f", + "code": "6", + "system": "urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf", + "display": "Does not apply or did not do for other reasons" + } + } + ] + }, + { + "linkId": "1eee7259-da1c-4cba-80a9-e67e684573a1", + "type": "choice", + "text": "Working or doing household chores", + "required": true, + "answerOption": [ + { + "valueCoding": { + "id": "5df54746-3a58-4153-8f07-1f13fdc09902", + "code": "1", + "system": "urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf", + "display": "Severely Limited" + } + }, + { + "valueCoding": { + "id": "a57b3a46-a005-4204-a07f-b2d535a6d5ab", + "code": "2", + "system": "urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf", + "display": "Limited quite a bit" + } + }, + { + "valueCoding": { + "id": "632d08fb-b521-4511-8887-b7c375d901f3", + "code": "3", + "system": "urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf", + "display": "Moderately limited" + } + }, + { + "valueCoding": { + "id": "fcbe715a-b86c-4fdc-8855-8aaa353d06d7", + "code": "4", + "system": "urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf", + "display": "Slightly limited" + } + }, + { + "valueCoding": { + "id": "d9cf6b00-5fed-48ac-a2be-a2e29688c5fa", + "code": "5", + "system": "urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf", + "display": "Did not limit at all" + } + }, + { + "valueCoding": { + "id": "8a20b488-aad4-4676-86d3-c494b979db3f", + "code": "6", + "system": "urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf", + "display": "Does not apply or did not do for other reasons" + } + } + ] + }, + { + "linkId": "883a22a8-2f6e-4b41-84b7-0028ed543192", + "type": "choice", + "text": "Visiting family or friends out of your home", + "required": true, + "answerOption": [ + { + "valueCoding": { + "id": "5df54746-3a58-4153-8f07-1f13fdc09902", + "code": "1", + "system": "urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf", + "display": "Severely Limited" + } + }, + { + "valueCoding": { + "id": "a57b3a46-a005-4204-a07f-b2d535a6d5ab", + "code": "2", + "system": "urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf", + "display": "Limited quite a bit" + } + }, + { + "valueCoding": { + "id": "632d08fb-b521-4511-8887-b7c375d901f3", + "code": "3", + "system": "urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf", + "display": "Moderately limited" + } + }, + { + "valueCoding": { + "id": "fcbe715a-b86c-4fdc-8855-8aaa353d06d7", + "code": "4", + "system": "urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf", + "display": "Slightly limited" + } + }, + { + "valueCoding": { + "id": "d9cf6b00-5fed-48ac-a2be-a2e29688c5fa", + "code": "5", + "system": "urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf", + "display": "Did not limit at all" + } + }, + { + "valueCoding": { + "id": "8a20b488-aad4-4676-86d3-c494b979db3f", + "code": "6", + "system": "urn:uuid:90ab9a5a-0ed7-43e0-9131-75ab9d8b94cf", + "display": "Does not apply or did not do for other reasons" + } + } + ] + } + ], + "required": false, + "text": "How much does your heart failure affect your lifestyle? Please indicate how your heart failure may have limited your participation in the following activities over the past 2 weeks." + }, + { + "linkId": "24108967-2ff3-40d0-c54f-a7b97bb84d05", + "type": "choice", + "text": "In the last two weeks, how much has your dizziness affected you?", + "required": true, + "answerOption": [ + { + "valueCoding": { + "id": "80df26e0-55a6-4d50-90de-b60cd851c4fb", + "code": "1", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "Extremely bothersome" + } + }, + { + "valueCoding": { + "id": "473f99f2-b9d2-4e92-85ed-ca78f3e0141c", + "code": "2", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "Quite a bit bothersome" + } + }, + { + "valueCoding": { + "id": "e3eab124-44f9-43a4-b1f6-e42b0199e39b", + "code": "3", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "Moderately bothersome" + } + }, + { + "valueCoding": { + "id": "253f487a-f26b-442f-8757-8a2401465fed", + "code": "4", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "Slightly bothersome" + } + }, + { + "valueCoding": { + "id": "7de45367-76b2-4b9b-8e4e-050bae6b309c", + "code": "5", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "Not at all bothersome" + } + }, + { + "valueCoding": { + "id": "3d1a8f9b-e666-4ad4-9202-571313a2b5d1", + "code": "6", + "system": "urn:uuid:2b2f9a9a-e721-495a-82d6-fbc1b22a27b2", + "display": "I've had no dizziness" + } + } + ] + } + ] +} From fbea108cbf0d8c132e050d820a464f1da39520e6 Mon Sep 17 00:00:00 2001 From: Paul Kraft Date: Wed, 12 Jun 2024 16:41:55 +0200 Subject: [PATCH 13/15] Improvements --- README.md | 100 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 59 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 61b28154..9af5a94e 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ Based on the [Extension](https://hl7.org/fhir/R4B/extensibility.html#Extension) |Property|Type|Values|Comments| |-|-|-|-| -|medicationClass|string|e.g. "BETABLOCKER"|A medicationClassId referring to a medicationClass specified in /medicationClasses/$medicationClassId$. One medication object may contain multiple medicationClass extension properties.| +|medicationClass|string|-|A `medicationClassId` referring to a medicationClass specified in /medicationClasses/$medicationClassId$. One medication object may contain multiple medicationClass extension properties.| |minimumDailyDose|double|e.g. 6.25|Unit: mg/day. May only occur once.| |targetDailyDose|double|e.g. 50.0|Unit: mg/day. May only occur once.| @@ -82,7 +82,7 @@ Based on the [Extension](https://hl7.org/fhir/R4B/extensibility.html#Extension) |Property|Type|Values|Comments| |-|-|-|-| -|id|string|e.g. "BETABLOCKER"|| +|id|string|-|-| |name|LocalizedText|-|A name for a given medicationClass to be displayed to a user.| |videoPath|string|e.g. "/videoSectionId/1/videos/2"|The path to retrieve the respective video from Firestore.| @@ -112,17 +112,16 @@ In this section, we describe all user-related data to be stored. The security ru |-|-|-|-| |dateOfBirth|Date|-|To be used for verification purposes.| |invitationCode|string|-|The invitationCode to be used when logging in to the app for the first time.| -|language|optional string|e.g. "en"|Following IETF BCP-47 / [FHIR ValueSet languages](https://hl7.org/fhir/R4B/valueset-languages.html)| -|dailyRemindersAreActive|boolean|true, false|Decides whether to send out daily reminder messages for this user.| -|textNotificationsAreActive|boolean|true, false|Decides whether to send text notifications for this user.| -|medicationRemindersAreActive|boolean|true, false|Decides whether to send medication reminder messages for this user.| +|language|optional string|e.g. "en"|Following IETF BCP-47 / [FHIR ValueSet languages](https://hl7.org/fhir/R4B/valueset-languages.html).| +|messagesSettings|-|-|See properties below.| +|messagesSettings>dailyRemindersAreActive|boolean|true, false|Decides whether to send out daily reminder messages for this user.| +|messagesSettings>textNotificationsAreActive|boolean|true, false|Decides whether to send text notifications for this user.| +|messagesSettings>medicationRemindersAreActive|boolean|true, false|Decides whether to send medication reminder messages for this user.| |timeZone|string|e.g. "America/Los_Angeles"|The value needs to correspond to an identifier from [TZDB](https://nodatime.org/TimeZones). It must not be an offset to UTC/GMT, since that wouldn't work well with daylight-savings (even if there is no daylight-savings time at that location). Also, don't use common abbreviations like PST, PDT, CEST, etc (they may be ambiguous, e.g. CST). If the timeZone is unknown, then "America/Los_Angeles" should be used.| -TBD: We might want to group `dailyRemindersAreActive`, `textNotificationsAreActive ` and `medicationRemindersAreActive ` into one object, e.g. `MessagesSettings`. - ### /users/$userId$/appointments/$appointmentId$ -Based on [FHIR Appointment](https://hl7.org/fhir/R4B/appointment.html). +Based on [FHIR Appointment](https://hl7.org/fhir/R4B/appointment.html), the following properties may be used, while additional properties are ignored by the Engage-HF system. |Property|Type|Values|Comments| |-|-|-|-| @@ -143,7 +142,7 @@ This data is required to send push notifications over the [Firebase Cloud Messag |Property|Type|Values|Comments| |-|-|-|-| |modifiedDate|DateTime|-|This date is updated whenever the token is sent to the server, even if it is not replaced by a different token. It simply reflects the last date we can definitely confirm the token was active. Idea: We may ignore some devices, if the token has not been updated for a long time, since the app has not been opened for a long time.| -|notificationToken|string|-|The FCM token as received from Firebase in the app. TBD: We may want to make this non-optional and simply not store device information, if there is no available token (e.g. if notifications are restricted).| +|notificationToken|string|-|The FCM token as received from Firebase in the app.| |platform|optional string|e.g. "iOS", "Android"|This information is important as context for the `osVersion`, `appVersion` and `appBuild` properties.| |osVersion|optional string|e.g. "17.5.1"|The version of the OS. Depending on the OS, they may have different formats to be specified separately.| |appVersion|optional string|e.g. "1.0.1"|The version of the app as it is specified on the App/Play Store.| @@ -160,24 +159,27 @@ A device may receive a different notification token at any time though. Therefor ### /users/$userId$/messages/$messageId$ +This data is used to display messages to the patient describing recent changes in their respective data from clinicians (e.g. updated medication requests) or calls-to-action to the patient. + |Property|Type|Values|Comments| |-|-|-|-| |dueDate|optional DateTime|-|The due date of the message to be shown in-app.| -|triggerDate|optional DateTime|-|A date to trigger a notification on the device. If not set, then there is no notification to trigger. The notification should be triggered by the server. TBD: Are there cases where a message would trigger multiple times or event- rather than date-driven?| |completionDate|optional DateTime|-|Specifies when a message has been completed. TBD: Messages containing a completionDate may either be hidden on user's devices or be shown crossed out.| |type|optional string|e.g. "questionnaireReminder"|Some messages are sent out on a regular basis, where only the most recent message is really relevant for the patient (e.g. a reminder for a questionnaire). With this property, we can easily find existing messages of the same type and replace them with a new one, if necessary.| |title|LocalizedText|e.g. "Watch Welcome Video in Education Page."|May be localized.| |description|optional LocalizedText|e.g. "The video shows how you will be able to use this app."|May be localized.| -|action|optional string|e.g. "engage-hf:/videoSections/engage-hf/videos/welcome"|See "Message types".| +|action|optional string|e.g. "/videoSections/engage-hf/videos/welcome"|See "Message types".| #### Message types +The following list describes all different types a message could have. Expiration of messages should only be handled by the server, but clients may communicate to the server that a message has been tapped. A client doesn't need to know about the `type` property, since we would otherwise need to check whether a new message type is supported by a client. It may also sort out message types unknown for the client's version. + |Type|Trigger|Expiration|Action| |-|-|-|-| |MedicationChange|Server: /users/$userId$/medicationRequests changed for a given user. Maximum 1 per day.|Tap|/videoSections/$videoSectionId$/videos/$videoId$| |WeightGain|Server: New body weight observation received with 3 lbs increase over prior week's median. Do not trigger again for 7 days.|Tap|/medications| |MedicationUptitration|Server:|Tap|/medications| -|Welcome|Server: When creating new user.|Video start? TBD: Tap?|/videoSections/$videoSectionId$/videos/$videoId$| +|Welcome|Server: When creating new user.|Tap|/videoSections/$videoSectionId$/videos/$videoId$| |Vitals|Server: Daily at certain time (respect timezone!)|When receiving blood pressure and weight measurements on the server from current day.|/measurements| |SymptomQuestionnaire|Server: Every 14 days.|After questionnaire responses received on server.|/questionnaires/$questionnaireId$| |PreVisit|Server: Day (24h) before visit.|After visit time or when visit is cancelled.|/healthSummary| @@ -197,6 +199,20 @@ Based on [FHIR AllergyIntolerance](https://hl7.org/fhir/R4B/allergyintolerance.h Q: Which codes should we use for contra-indications? We could simply assume a limited set for now (i.e. the ones we allow for selection in the web dashboard), but when interfacing with an EHR, we would need to be able to consider all relevant codes in the algorithm(s). +#### Relevant codes + +TBD: We need to define a list of relevant codes for each medication class and medication to be used as input by clinicians and further be checked by the algorithm(s). Whenever we interface with an EHR, we will need to add checks for parents/children of the given codes to make sure, we do not ignore a given contra-indication, even though it is input correctly. + +Medication classes: + +|Medication Class|Code| +|-|-| + +Medications: + +|Medication|Code|Alternative| +|-|-|-| + ### /users/$userId$/medicationRequests/$medicationRequestId$ Based on [FHIR MedicationRequest](https://hl7.org/fhir/R4B/medicationrequest.html), the following properties may be used, while additional properties are ignored by the Engage-HF system. @@ -204,11 +220,11 @@ Based on [FHIR MedicationRequest](https://hl7.org/fhir/R4B/medicationrequest.htm |Property|Type|Values|Comments| |-|-|-|-| |id|string|-|[Resource](https://hl7.org/fhir/R4B/resource.html): Logical id of this artifact| -|medication|Reference(Medication) or CodeableConcept|-|TBD: `medicationId` as used in /medications/$medicationId$ or a CodeableConcept containing the same information as one of the medications listed in /medications/$medicationId$| -|dosageInstruction|list of Dosage|-|-| +|medication|Reference(Medication) or CodeableConcept|-|CodeableConcept containing one of the codes from /medications/$medicationId$| +|dosageInstruction|Dosage|-|-| |patient|string|e.g. "allergy", "intolerance"|`userId` as used in /users/$userId$ and related collections.| -The `dosageInstruction` property may contain values containing the following properties: +The `dosageInstruction` property may contain values with the following properties: |Property|Type|Values|Comments| |-|-|-|-| @@ -220,9 +236,9 @@ The `dosageInstruction` property may contain values containing the following pro |doseAndRate|list of Element|-|Amount of medication administered| |doseAndRate>type|optional [DoseRateType](https://hl7.org/fhir/R4B/codesystem-dose-rate-type.html)|e.g. "calculated", "ordered"|| |doseAndRate>dose|optional [SimpleQuantity](https://hl7.org/fhir/R4B/datatypes.html#SimpleQuantity)|-|TBD: We should either use "pills" or some weight unit here.| -|maxDosePerPeriod|optional [Ratio](https://build.fhir.org/datatypes.html#ratio)|-|Upper limit on medication per unit of time| -|maxDosePerAdministration|optional [SimpleQuantity](https://build.fhir.org/datatypes.html#SimpleQuantity)|-|Upper limit on medication per administration| -|maxDosePerLifetime|optional [SimpleQuantity](https://build.fhir.org/datatypes.html#SimpleQuantity)|-|Upper limit on medication per unit of time| +|maxDosePerPeriod|optional [Ratio](https://hl7.org/fhir/R4B/datatypes.html#ratio)|-|Upper limit on medication per unit of time| +|maxDosePerAdministration|optional [SimpleQuantity](https://hl7.org/fhir/R4B/datatypes.html#SimpleQuantity)|-|Upper limit on medication per administration| +|maxDosePerLifetime|optional [SimpleQuantity](https://hl7.org/fhir/R4B/datatypes.html#SimpleQuantity)|-|Upper limit on medication per unit of time| There may be up to three intakes per day (morning, mid-day and evening) with either 0.5, 1 or 2 pills. The dosages should always be grouped by medication, i.e. there should not be multiple medication elements concerning the same medication but different dosage instructions. Instead, one medication element shall be used for that medication with multiple dosage instructions. @@ -239,33 +255,38 @@ Based on [FHIR Observation](https://hl7.org/fhir/R4B/observation.html), the foll |component|list of components|-|Instead of containing a single `value` property, some observations are composed of multiple components (e.g. a blood pressure observation contains a diastolic and systolic component).| |component[x]>code|[Code](https://hl7.org/fhir/R4B/valueset-observation-codes.html)|e.g. `{"system":"http://loinc.org","code":"55423-8","display":"Number of steps"}`|Use one of the codes mentioned below.| |component[x]>value|optional [Quantity](https://hl7.org/fhir/R4B/datatypes.html#Quantity)|e.g. `{"code":"mm[Hg]","system":"http://unitsofmeasure.org","unit":"mmHg","value":120}`|Use one of the units listed below.| -|effective|[Period](https://fhir-ru.github.io/datatypes.html#Period)|-|For observations that happened in only one instant, we use periods with the same start and end time.| +|effective|[Period](https://hl7.org/fhir/R4B/datatypes.html#period), [Instant](https://hl7.org/fhir/R4B/datatypes.html#instant) or [DateTime](https://hl7.org/fhir/R4B/datatypes.html#dateTime)|-|Use DateTime/Instant for instant observation and periods for longer observations (e.g. more than 1 minute).| + +#### Blood Pressure + +Blood pressure observations contain the following code and no value. -TBD: The fixed use of the period type in the `effective` property originates in HealthConnectOnFHIR. Should we also allow DateTime for instant observations? +|code>system|code>code|code>display| +|-|-|-| +|"https://loinc.org"|"85354-9"|"Blood pressure panel with all children optional"| -#### Compound Observations +Further, blood pressure observations have two components. -|code>system|code>code|code>display|value|components| +|code>system|code>code|code>display|value>system|value>value|value>code|value>unit| |-|-|-|-|-|-| -|"http://loinc.org"|"85354-9"|"Blood pressure panel with all children optional"|-|"Diastolic blood pressure", "Systolic blood pressure"| +|"http://loinc.org"|"8462-4"|"Diastolic blood pressure"|"http://unitsofmeasure.org"|double|"mm[Hg]"|"mmHg"| +|"http://loinc.org"|"8480-6"|"Systolic blood pressure"|"http://unitsofmeasure.org"|double|"mm[Hg]"|"mmHg"| -#### Simple Observations +#### Body Weight -|code>system|code>code|code>display|value>value|value>code|value>unit| +Body mass observations contain the following code and value. + +|code>system|code>code|code>display|value>system|value>value|value>code|value>unit| |-|-|-|-|-|-| -|"http://loinc.org"|"55423-8"|"Number of steps"|double|?|"steps"| -|"http://loinc.org"|"91557-9"|"Lean body weight"|double|"[lb_av]"|"g" or "lbs"| -|"http://loinc.org"|"29463-7"|"Body weight"|double|"[lb_av]"|"g" or "lbs"| -|"http://loinc.org"|"41981-2"|"Calories burned"|double|?|"kcal"| -|"http://loinc.org"|"8302-2"|"Body height"|double|?|"m"| -|"http://loinc.org"|"8867-4"|"Heart rate"|double|?|"beats/minute"| -|"http://loinc.org"|"8310-5"|"Body temperature"|double|?|"°C"| -|"http://loinc.org"|"8462-4"|"Diastolic blood pressure"|double|"mm[Hg]"|"mmHg"| -|"http://loinc.org"|"8480-6"|"Systolic blood pressure"|double|"mm[Hg]"|"mmHg"| +|"http://loinc.org"|"29463-7"|"Body weight"|double|"http://unitsofmeasure.org"|"kg"|"kg"| + +#### Heart Rate -TODO: Currently, HealthKitOnFHIR and HealthConnectOnFHIR still use different units to encode the same observations. We should probably aim to always use the same unit to reduce unit conversions, but each client would need to be able to handle multiple units for each observation type. We should probably aim for SI units, even though the system will primarily be used in the US. TBD. +Heart rate observations contain the following code and value. -[Codes/Units in HealthKitOnFHIR](https://github.com/StanfordBDHG/HealthKitOnFHIR/blob/main/Sources/HealthKitOnFHIR/Resources/HKSampleMapping.json) +|code>system|code>code|code>display|value>system|value>value|value>code|value>unit| +|-|-|-|-|-|-| +|"http://loinc.org"|"8867-4"|"Heart rate"|double|"http://unitsofmeasure.org"|"/min"|"beats/minute"| ### /users/$userId$/questionnaireResponses/$questionnaireResponseId$ @@ -275,8 +296,7 @@ Based on [FHIR QuestionnaireResponse](https://hl7.org/fhir/R4B/questionnaireresp |-|-|-|-| |id|string|-|[Resource](https://hl7.org/fhir/R4B/resource.html): Logical id of this artifact| |questionnaire|string|-|canonical representation of the questionnaire, i.e. t| -|author|string|-|The patient's id| -|source|string|-|The patient's id| +|author|string|-|The patient's `userId`| |authored|DateTime|-|The date the answers were gathered.| |status|[QuestionnaireResponseStatus](https://hl7.org/fhir/R4B/valueset-questionnaire-answers-status.html)|-|Will most likely always be `completed`.| |item|list of Item|-|-| @@ -285,5 +305,3 @@ Based on [FHIR QuestionnaireResponse](https://hl7.org/fhir/R4B/questionnaireresp |item[x]>text|optional string|-|Name for group or question text| |item[x]>answer|list of Answer|-|response(s) to the question| |item[x]>answer[y]>value|any|-|Value depending on the type of question in the survey, e.g. boolean, integer, date, string, etc| - -TBD: Should we use `source` and/or `patient` to store a reference to the patient? From bc54ed0055e29b403e4d49376110f35837e2dfe5 Mon Sep 17 00:00:00 2001 From: Paul Kraft Date: Sat, 15 Jun 2024 16:19:24 -0700 Subject: [PATCH 14/15] Fix columns for observation values --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9af5a94e..8693c07f 100644 --- a/README.md +++ b/README.md @@ -268,7 +268,7 @@ Blood pressure observations contain the following code and no value. Further, blood pressure observations have two components. |code>system|code>code|code>display|value>system|value>value|value>code|value>unit| -|-|-|-|-|-|-| +|-|-|-|-|-|-|-| |"http://loinc.org"|"8462-4"|"Diastolic blood pressure"|"http://unitsofmeasure.org"|double|"mm[Hg]"|"mmHg"| |"http://loinc.org"|"8480-6"|"Systolic blood pressure"|"http://unitsofmeasure.org"|double|"mm[Hg]"|"mmHg"| @@ -277,7 +277,7 @@ Further, blood pressure observations have two components. Body mass observations contain the following code and value. |code>system|code>code|code>display|value>system|value>value|value>code|value>unit| -|-|-|-|-|-|-| +|-|-|-|-|-|-|-| |"http://loinc.org"|"29463-7"|"Body weight"|double|"http://unitsofmeasure.org"|"kg"|"kg"| #### Heart Rate @@ -285,7 +285,7 @@ Body mass observations contain the following code and value. Heart rate observations contain the following code and value. |code>system|code>code|code>display|value>system|value>value|value>code|value>unit| -|-|-|-|-|-|-| +|-|-|-|-|-|-|-| |"http://loinc.org"|"8867-4"|"Heart rate"|double|"http://unitsofmeasure.org"|"/min"|"beats/minute"| ### /users/$userId$/questionnaireResponses/$questionnaireResponseId$ From 608c4cc7a8e17f391ae8b765486f9081c7f4b798 Mon Sep 17 00:00:00 2001 From: Paul Kraft Date: Mon, 17 Jun 2024 10:17:32 -0700 Subject: [PATCH 15/15] Squash the last 4 commits to avoid non-signed commits --- README.md | 173 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 165 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 8693c07f..b1a82b80 100644 --- a/README.md +++ b/README.md @@ -28,14 +28,13 @@ A LocalizedText object cannot be used in FHIR-conforming types due to its incomp } ``` - ## /questionnaires In this section, we describe all the information stored for questionnaires. ### /questionnaires/$questionnaireId$ -Based on [FHIR Questionnaire](https://hl7.org/fhir/R4B/questionnaire.html): +Based on [FHIR Questionnaire](https://hl7.org/fhir/R4B/questionnaire.html), the following properties may be used, while additional properties are ignored by the Engage-HF system. |Property|Type|Values|Comments| |-|-|-|-| @@ -61,7 +60,7 @@ In this section, we describe information regarding all the medications to be spe ### /medications/$medicationId$ -Based on [FHIR Medication](https://hl7.org/fhir/R4B/medication.html): +Based on [FHIR Medication](https://hl7.org/fhir/R4B/medication.html), the following properties may be used, while additional properties are ignored by the Engage-HF system. |Property|Type|Values|Comments| |-|-|-|-| @@ -201,17 +200,175 @@ Q: Which codes should we use for contra-indications? We could simply assume a li #### Relevant codes -TBD: We need to define a list of relevant codes for each medication class and medication to be used as input by clinicians and further be checked by the algorithm(s). Whenever we interface with an EHR, we will need to add checks for parents/children of the given codes to make sure, we do not ignore a given contra-indication, even though it is input correctly. +Here we keep a list of relevant codes for medication classes & medications for use in /medications, /medicationClasses and /users/$userId$/allergyIntolerances/$allergyIntoleranceId$. -Medication classes: +##### Medication classes -|Medication Class|Code| +|Medication class|SNOMED CT name|code| |-|-| +|Beta blocker|Substance with beta adrenergic receptor antagonist mechanism of action (substance)|[373254001](https://browser.ihtsdotools.org/?perspective=full&conceptId1=373254001)| +|SGLT2i|Substance with sodium glucose cotransporter subtype 2 inhibitor mechanism of action (substance)|[703673007](https://browser.ihtsdotools.org/?perspective=full&conceptId1=703673007)| +|MRA|Substance with aldosterone receptor antagonist mechanism of action (substance)|[372603003](https://browser.ihtsdotools.org/?perspective=full&conceptId1=372603003)| +|ACEI|Substance with angiotensin-converting enzyme inhibitor mechanism of action (substance)|[372733002](https://browser.ihtsdotools.org/?perspective=full&conceptId1=372733002)| +|ARB|Substance with renin-angiotensin system inhibitor mechanism of action (substance)|[866173006](https://browser.ihtsdotools.org/?perspective=full&conceptId1=866173006)| +|ARNI|Substance with neprilysin inhibitor mechanism of action (substance)|[786886009](https://browser.ihtsdotools.org/?perspective=full&conceptId1=786886009)| +|Diuretics|Diuretic (substance)|[372695000](https://browser.ihtsdotools.org/?perspective=full&conceptId1=372695000)| -Medications: +###### Medications & Doses -|Medication|Code|Alternative| +|Medication|Dose|Code| |-|-|-| +|Metoprolol succinate|-|[412432007](https://browser.ihtsdotools.org/?perspective=full&conceptId1=412432007)| +|Metoprolol succinate ER|25mg|[879978003](https://browser.ihtsdotools.org/?perspective=full&conceptId1=879978003)| +|Metoprolol succinate ER|50mg|[879979006](https://browser.ihtsdotools.org/?perspective=full&conceptId1=879979006)| +|Metoprolol succinate ER|100mg|[879980009](https://browser.ihtsdotools.org/?perspective=full&conceptId1=879980009)| +|Metoprolol succinate ER|200mg|[879981008](https://browser.ihtsdotools.org/?perspective=full&conceptId1=879981008)| +|Carvedilol|-|[386870007](https://browser.ihtsdotools.org/?perspective=full&conceptId1=386870007)| +|Carvedilol|3.125mg|[318633000](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318633000)| +|Carvedilol|6.25mg|[318635007](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318635007)| +|Carvedilol|12.5mg|[318631003](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318631003)| +|Carvedilol|25mg|[318632005](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318632005)| +|Carvedilol phosphate|-|[426471008](https://browser.ihtsdotools.org/?perspective=full&conceptId1=426471008)| +|Carvedilol phosphate ER|10mg|[1187445001](https://browser.ihtsdotools.org/?perspective=full&conceptId1=1187445001)| +|Carvedilol phosphate ER|20mg|[1187446000](https://browser.ihtsdotools.org/?perspective=full&conceptId1=1187446000)| +|Carvedilol phosphate ER|40mg|[1208576006](https://browser.ihtsdotools.org/?perspective=full&conceptId1=1208576006)| +|Carvedilol phosphate ER|80mg|[1208577002](https://browser.ihtsdotools.org/?perspective=full&conceptId1=1208577002)| +|Bisoprolol|-|[386868003](https://browser.ihtsdotools.org/?perspective=full&conceptId1=386868003)| +|Bisoprolol|5mg|[318590006](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318590006)| +|Bisoprolol|10mg|[318591005](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318591005)| +|Dapagliflozin|-|[703674001](https://browser.ihtsdotools.org/?perspective=full&conceptId1=703674001)| +|Dapagliflozin|10mg|[1145541007](https://browser.ihtsdotools.org/?perspective=full&conceptId1=1145541007)| +|Empagliflozin|-|[703894008](https://browser.ihtsdotools.org/?perspective=full&conceptId1=703894008)| +|Empagliflozin|10mg|[703896005](https://browser.ihtsdotools.org/?perspective=full&conceptId1=703896005)| +|Empagliflozin|25mg|[703897001](https://browser.ihtsdotools.org/?perspective=full&conceptId1=703897001)| +|Sotagliflozin|-|TBD| +|Sotagliflozin|200mg|TBD| +|Sotagliflozin|400mg|TBD| +|Bexagliflozin|-|TBD| +|Bexagliflozin|20mg|TBD| +|Canagliflozin|-|[703676004](https://browser.ihtsdotools.org/?perspective=full&conceptId1=703676004)| +|Canagliflozin|100mg|[703682001](https://browser.ihtsdotools.org/?perspective=full&conceptId1=703682001)| +|Canagliflozin|300mg|[765627002](https://browser.ihtsdotools.org/?perspective=full&conceptId1=765627002)| +|Ertugliflozin|-|[764274008](https://browser.ihtsdotools.org/?perspective=full&conceptId1=764274008)| +|Ertugliflozin|5mg|[1162397007](https://browser.ihtsdotools.org/?perspective=full&conceptId1=1162397007)| +|Ertugliflozin|15mg|[1162394000](https://browser.ihtsdotools.org/?perspective=full&conceptId1=1162394000)| +|Spironolactone|-|[387078006](https://browser.ihtsdotools.org/?perspective=full&conceptId1=387078006)| +|Spironolactone|25mg|[318056008](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318056008)| +|Spironolactone|50mg|[318057004](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318057004)| +|Spironolactone|100mg|[318058009](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318058009)| +|Eplerenone|-|[407010008](https://browser.ihtsdotools.org/?perspective=full&conceptId1=407010008)| +|Eplerenone|25mg|[407011007](https://browser.ihtsdotools.org/?perspective=full&conceptId1=407011007)| +|Eplerenone|50mg|[407012000](https://browser.ihtsdotools.org/?perspective=full&conceptId1=407012000)| +|Quinapril|-|[386874003](https://browser.ihtsdotools.org/?perspective=full&conceptId1=386874003)| +|Quinapril|5mg|[318885001](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318885001)| +|Quinapril|10mg|[318886000](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318886000)| +|Quinapril|20mg|[318887009](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318887009)| +|Quinapril|40mg|[318894007](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318894007)| +|Perindopril|-|[372916001](https://browser.ihtsdotools.org/?perspective=full&conceptId1=372916001)| +|Perindopril|2mg|[318896009](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318896009)| +|Perindopril|4mg|[318897000](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318897000)| +|Perindopril|8mg|[374667004](https://browser.ihtsdotools.org/?perspective=full&conceptId1=374667004)| +|Ramipril|-|[386872004](https://browser.ihtsdotools.org/?perspective=full&conceptId1=386872004)| +|Ramipril|1.25mg|tablet: [408040007](https://browser.ihtsdotools.org/?perspective=full&conceptId1=408040007), capsule: [318900007](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318900007)| +|Ramipril|2.5mg|tablet: [408050008](https://browser.ihtsdotools.org/?perspective=full&conceptId1=408050008), capsule: [318901006](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318901006)| +|Ramipril|5mg|tablet: [408051007](https://browser.ihtsdotools.org/?perspective=full&conceptId1=408051007), capsule: [318902004](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318902004)| +|Ramipril|10mg|tablet: [408052000](https://browser.ihtsdotools.org/?perspective=full&conceptId1=408052000), capsule: [318906001](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318906001)| +|Benazepril|-|[372511001](https://browser.ihtsdotools.org/?perspective=full&conceptId1=372511001)| +|Benazepril|5mg|[376516008](https://browser.ihtsdotools.org/?perspective=full&conceptId1=376516008)| +|Benazepril|10mg|[376518009](https://browser.ihtsdotools.org/?perspective=full&conceptId1=376518009)| +|Benazepril|20mg|[376520007](https://browser.ihtsdotools.org/?perspective=full&conceptId1=376520007)| +|Benazepril|40mg|[376521006](https://browser.ihtsdotools.org/?perspective=full&conceptId1=376521006)| +|Captopril|-|[387160004](https://browser.ihtsdotools.org/?perspective=full&conceptId1=387160004)| +|Captopril|12.5mg|[318820009](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318820009)| +|Captopril|25mg|[318821008](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318821008)| +|Captopril|50mg|[318824000](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318824000)| +|Captopril|100mg|[375105000](https://browser.ihtsdotools.org/?perspective=full&conceptId1=375105000)| +|Enalapril|-|[372658000](https://browser.ihtsdotools.org/?perspective=full&conceptId1=372658000)| +|Enalapril|2.5mg|[318850001](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318850001)| +|Enalapril|5mg|[318851002](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318851002)| +|Enalapril|10mg|[318853004](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318853004)| +|Enalapril|20mg|[318855006](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318855006)| +|Lisinopril|-|[386873009](https://browser.ihtsdotools.org/?perspective=full&conceptId1=386873009)| +|Lisinopril|2.5mg|[318857003](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318857003)| +|Lisinopril|5mg|[318858008](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318858008)| +|Lisinopril|10mg|[318859000](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318859000)| +|Lisinopril|20mg|[318860005](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318860005)| +|Lisinopril|30mg|[374040006](https://browser.ihtsdotools.org/?perspective=full&conceptId1=374040006)| +|Lisinopril|40mg|[376772000](https://browser.ihtsdotools.org/?perspective=full&conceptId1=376772000)| +|Fosinopril|-|[372510000](https://browser.ihtsdotools.org/?perspective=full&conceptId1=372510000), sodium: [108570006](https://browser.ihtsdotools.org/?perspective=full&conceptId1=108570006)| +|Fosinopril|10mg|sodium: [318909008](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318909008)| +|Fosinopril|20mg|sodium: [318910003](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318910003)| +|Fosinopril|40mg|sodium: [376699008](https://browser.ihtsdotools.org/?perspective=full&conceptId1=376699008)| +|Trandolapril|-|[386871006](https://browser.ihtsdotools.org/?perspective=full&conceptId1=386871006)| +|Trandolapril|1mg|[375094007](https://browser.ihtsdotools.org/?perspective=full&conceptId1=375094007)| +|Trandolapril|2mg|[375095008](https://browser.ihtsdotools.org/?perspective=full&conceptId1=375095008)| +|Trandolapril|4mg|[375096009](https://browser.ihtsdotools.org/?perspective=full&conceptId1=375096009)| +|Moexipril|-|[373442003](https://browser.ihtsdotools.org/?perspective=full&conceptId1=373442003)| +|Moexipril|7.5mg|[318934008](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318934008)| +|Moexipril|15mg|[318935009](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318935009)| +|Losartan|-|[373567002](https://browser.ihtsdotools.org/?perspective=full&conceptId1=373567002), potassium: [108582002](https://browser.ihtsdotools.org/?perspective=full&conceptId1=108582002)| +|Losartan|25mg|potassium: [318955005](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318955005)| +|Losartan|50mg|potassium: [318956006](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318956006)| +|Losartan|100mg|potassium: [407784004](https://browser.ihtsdotools.org/?perspective=full&conceptId1=407784004)| +|Valsartan|-|[386876001](https://browser.ihtsdotools.org/?perspective=full&conceptId1=386876001)| +|Valsartan|40mg|[416515008](https://browser.ihtsdotools.org/?perspective=full&conceptId1=416515008)| +|Valsartan|80mg|[375034009](https://browser.ihtsdotools.org/?perspective=full&conceptId1=375034009)| +|Valsartan|160mg|[375035005](https://browser.ihtsdotools.org/?perspective=full&conceptId1=375035005)| +|Valsartan|320mg|[376487009](https://browser.ihtsdotools.org/?perspective=full&conceptId1=376487009)| +|Candesartan|-|[372512008](https://browser.ihtsdotools.org/?perspective=full&conceptId1=372512008)| +|Candesartan|2mg|cilexetil: [318977009](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318977009)| +|Candesartan|4mg|cilexetil: [318978004](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318978004)| +|Candesartan|8mg|cilexetil: [318979007](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318979007)| +|Candesartan|16mg|cilexetil: [318980005](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318980005)| +|Candesartan|32mg|cilexetil: [376998003](https://browser.ihtsdotools.org/?perspective=full&conceptId1=376998003)| +|Irbesartan|-|[386877005](https://browser.ihtsdotools.org/?perspective=full&conceptId1=386877005)| +|Irbesartan|75mg|[318968002](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318968002)| +|Irbesartan|150mg|[318969005](https://browser.ihtsdotools.org/?perspective=full&conceptId1318969005)| +|Irbesartan|300mg|[318970006](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318970006)| +|Telmisartan|-|[387069000](https://browser.ihtsdotools.org/?perspective=full&conceptId1=387069000)| +|Telmisartan|20mg|[134463001](https://browser.ihtsdotools.org/?perspective=full&conceptId1=134463001)| +|Telmisartan|40mg|[318986004](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318986004)| +|Telmisartan|80mg|[318987008](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318987008)| +|Olmesartan|-|[412259001](https://browser.ihtsdotools.org/?perspective=full&conceptId1=412259001), medoxomil: [412260006](https://browser.ihtsdotools.org/?perspective=full&conceptId1=412260006)| +|Olmesartan|5mg|medoxomil: [385541002](https://browser.ihtsdotools.org/?perspective=full&conceptId1=385541002)| +|Olmesartan|10mg|medoxomil: [408055003](https://browser.ihtsdotools.org/?perspective=full&conceptId1=408055003)| +|Olmesartan|20mg|medoxomil: [385542009](https://browser.ihtsdotools.org/?perspective=full&conceptId1=385542009)| +|Olmesartan|40mg|medoxomil: [385543004](https://browser.ihtsdotools.org/?perspective=full&conceptId1=385543004)| +|Azilsartan|-|[385542009](https://browser.ihtsdotools.org/?perspective=full&conceptId1=385542009), medoxomil: [449561004](https://browser.ihtsdotools.org/?perspective=full&conceptId1=449561004)| +|Azilsartan|20mg|medoxomil: [895430006](https://browser.ihtsdotools.org/?perspective=full&conceptId1=895430006)| +|Azilsartan|40mg|medoxomil: [1137333005](https://browser.ihtsdotools.org/?perspective=full&conceptId1=1137333005)| +|Azilsartan|80mg|medoxomil: [1137623008](https://browser.ihtsdotools.org/?perspective=full&conceptId1=1137623008)| +|Eprosartan|-|[396044005](https://browser.ihtsdotools.org/?perspective=full&conceptId1=396044005), mesilate: [129488003](https://browser.ihtsdotools.org/?perspective=full&conceptId1=129488003)| +|Eprosartan|300mg|mesilate: [318994006](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318994006)| +|Eprosartan|400mg|mesilate: [318995007](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318995007)| +|Eprosartan|600mg|mesilate: [318996008](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318995007)| +|Eprosartan|800mg|TBD| +|Sacubitril- Valsartan|-|[777480008](https://browser.ihtsdotools.org/?perspective=full&conceptId1=777480008)| +|Sacubitril- Valsartan|24-26mg|[1162681006](https://browser.ihtsdotools.org/?perspective=full&conceptId1=1162681006)| +|Sacubitril- Valsartan|49-51mg|[1162682004](https://browser.ihtsdotools.org/?perspective=full&conceptId1=1162682004)| +|Sacubitril- Valsartan|97-103mg|[1162718004](https://browser.ihtsdotools.org/?perspective=full&conceptId1=1162718004)| +|Furosemide|-|[387475002](https://browser.ihtsdotools.org/?perspective=full&conceptId1=387475002)| +|Furosemide|20mg|[317971007](https://browser.ihtsdotools.org/?perspective=full&conceptId1=317971007)| +|Furosemide|40mg|[317972000](https://browser.ihtsdotools.org/?perspective=full&conceptId1=317972000)| +|Furosemide|80mg|[395510001](https://browser.ihtsdotools.org/?perspective=full&conceptId1=395510001)| +|Furosemide|100mg|[1187430008](https://browser.ihtsdotools.org/?perspective=full&conceptId1=1187430008)| +|Furosemide|500mg|[317973005](https://browser.ihtsdotools.org/?perspective=full&conceptId1=317973005)| +|Bumetanide|-|[387498005](https://browser.ihtsdotools.org/?perspective=full&conceptId1=387498005)| +|Bumetanide|0.5mg|[375553009](https://browser.ihtsdotools.org/?perspective=full&conceptId1=375553009)| +|Bumetanide|1mg|[318021009](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318021009)| +|Bumetanide|2mg|[375648005](https://browser.ihtsdotools.org/?perspective=full&conceptId1=375648005)| +|Bumetanide|5mg|[318022002](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318022002)| +|Torsemide|-|[108476002](https://browser.ihtsdotools.org/?perspective=full&conceptId1=108476002)| +|Torsemide|2.5mg|[318040003](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318040003)| +|Torsemide|5mg|[318041004](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318041004)| +|Torsemide|10mg|[318042006](https://browser.ihtsdotools.org/?perspective=full&conceptId1=318042006)| +|Torsemide|20mg|[375711005](https://browser.ihtsdotools.org/?perspective=full&conceptId1=375711005)| +|Torsemide|40mg|TBD| +|Torsemide|60mg|TBD| +|Torsemide|100mg|[375714002](https://browser.ihtsdotools.org/?perspective=full&conceptId1=375714002)| +|Ethacrynic Acid|-|[373536004](https://browser.ihtsdotools.org/?perspective=full&conceptId1=373536004)| +|Ethacrynic Acid|25mg|[376668007](https://browser.ihtsdotools.org/?perspective=full&conceptId1=376668007)| +|Ethacrynic Acid|50mg|[376679002](https://browser.ihtsdotools.org/?perspective=full&conceptId1=376679002)| ### /users/$userId$/medicationRequests/$medicationRequestId$