import streamlit as st from fhir.resources.observation import Observation from datetime import datetime import requests import json # FHIR server endpoint base_url = "https:///fhir/" # Function to create an Observation resource def create_observation_resource(activity, category, calories, duration, distance, heart_rate): observation = Observation() observation.status = "final" observation.category = [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "activity"}]}] observation.code = {"coding": [{"system": "http://loinc.org", "code": "55409-7", "display": "Exercise tracking panel"}]} observation.effectiveDateTime = datetime.now().isoformat() observation.component = [] if activity: observation.component.append({"code": {"coding": [{"system": "http://loinc.org", "code": "73985-4", "display": "Exercise activity"}]}, "valueString": activity}) if category: observation.component.append({"code": {"coding": [{"system": "http://loinc.org", "code": "73986-2", "display": "Exercise aerobic category"}]}, "valueString": category}) if calories: observation.component.append({"code": {"coding": [{"system": "http://loinc.org", "code": "55421-2", "display": "Calories burned Machine estimate"}]}, "valueQuantity": {"value": calories, "unit": "kcal"}}) if duration: observation.component.append({"code": {"coding": [{"system": "http://loinc.org", "code": "55411-3", "display": "Exercise duration"}]}, "valueQuantity": {"value": duration, "unit": "min"}}) if distance: observation.component.append({"code": {"coding": [{"system": "http://loinc.org", "code": "55412-1", "display": "Exercise distance unspecified time"}]}, "valueQuantity": {"value": distance, "unit": "[mi_us];km"}}) if heart_rate: observation.component.append({"code": {"coding": [{"system": "http://loinc.org", "code": "55422-0", "display": "Heart rate Encounter maximum"}]}, "valueQuantity": {"value": heart_rate, "unit": "{beats}/min"}}) return observation # Function to create an Observation resource on the FHIR server def create_observation(observation): headers = {"Content-Type": "application/fhir+json"} response = requests.post(base_url + "Observation", data=json.dumps(observation.as_json()), headers=headers) if response.status_code == 201: st.success("Observation created successfully!") else: st.error("Error creating Observation.") # Streamlit user interface def app(): st.title("LOINC Exercise Tracking Panel") activity = st.text_input("Exercise activity") category = st.selectbox("Exercise aerobic category", ["", "Aerobic", "Anaerobic"]) calories = st.number_input("Calories burned (Machine estimate)", min_value=0, step=1) duration = st.number_input("Exercise duration (minutes)", min_value=0, step=1) distance = st.number_input("Exercise distance unspecified time", min_value=0, step=0.01) heart_rate = st.number_input("Heart rate Encounter maximum", min_value=0, step=1) if st.button("Record Exercise"): observation = create_observation_resource(activity, category, calories, duration, distance, heart_rate) create_observation(observation)