99 lines
3.0 KiB
Python
99 lines
3.0 KiB
Python
import pandas as pd
|
|
import plotly.graph_objects as go
|
|
import requests
|
|
import streamlit as st
|
|
|
|
from auth import require_auth
|
|
from nightscout_client import NightscoutConfigError
|
|
from profile_data import segments_table, segments_to_hourly_bars, total_daily_basal
|
|
from ui_common import get_colors, hex_to_rgba, load_profile
|
|
|
|
st.set_page_config(page_title="Glucose dashboard — Insulineprofiel", page_icon="📊", layout="wide")
|
|
require_auth()
|
|
|
|
st.title("Insulineprofiel")
|
|
st.caption("Het meest recent gebruikte pompprofiel: basaalschema, ISF, koolhydraatratio en DIA.")
|
|
|
|
try:
|
|
profile = load_profile()
|
|
except NightscoutConfigError as exc:
|
|
st.error(str(exc))
|
|
st.stop()
|
|
except (requests.RequestException, ValueError) as exc:
|
|
st.error(f"Kon geen profiel ophalen van Nightscout: {exc}")
|
|
st.stop()
|
|
|
|
if not profile:
|
|
st.info("Geen pompprofiel gevonden op deze Nightscout-instantie.")
|
|
st.stop()
|
|
|
|
colors = get_colors()
|
|
|
|
col1, col2 = st.columns(2)
|
|
col1.metric("DIA (werkingsduur insuline)", f"{profile['dia']:.1f} uur")
|
|
col2.caption(f"Profielnaam: {profile['name'] or '—'}")
|
|
|
|
st.subheader("Basaalschema")
|
|
bars = segments_to_hourly_bars(profile["basal"])
|
|
fig = go.Figure(
|
|
go.Scatter(
|
|
x=[b["hour"] for b in bars],
|
|
y=[b["value"] for b in bars],
|
|
mode="lines",
|
|
line={"shape": "hv", "color": colors["basal"], "width": 2},
|
|
fill="tozeroy",
|
|
fillcolor=hex_to_rgba(colors["basal"], 0.3),
|
|
opacity=0.8,
|
|
name="Basaal",
|
|
hovertemplate="%{x:.0f}:00 · %{y:.2f} E/uur<extra></extra>",
|
|
)
|
|
)
|
|
fig.update_layout(
|
|
paper_bgcolor="rgba(0,0,0,0)",
|
|
plot_bgcolor="rgba(0,0,0,0)",
|
|
font_color=colors["text"],
|
|
height=320,
|
|
margin={"l": 10, "r": 10, "t": 10, "b": 10},
|
|
xaxis={"title": "Uur van de dag", "range": [0, 24], "dtick": 2, "gridcolor": colors["grid"]},
|
|
yaxis={"title": "E/uur", "gridcolor": colors["grid"], "rangemode": "tozero"},
|
|
showlegend=False,
|
|
)
|
|
st.plotly_chart(fig, width="stretch")
|
|
|
|
basal_rows = segments_table(profile["basal"])
|
|
st.dataframe(
|
|
pd.DataFrame(basal_rows).rename(
|
|
columns={"start": "Van", "end": "Tot", "value": "Basaalsnelheid (E/uur)"}
|
|
),
|
|
width="stretch",
|
|
hide_index=True,
|
|
)
|
|
|
|
col_isf, col_ratio = st.columns(2)
|
|
with col_isf:
|
|
st.subheader("Insulinegevoeligheid (ISF)")
|
|
isf_rows = segments_table(profile["sens"])
|
|
st.dataframe(
|
|
pd.DataFrame(isf_rows).rename(
|
|
columns={"start": "Van", "end": "Tot", "value": "ISF (mmol/L per E)"}
|
|
),
|
|
width="stretch",
|
|
hide_index=True,
|
|
)
|
|
|
|
with col_ratio:
|
|
st.subheader("Koolhydraatratio")
|
|
ratio_rows = segments_table(profile["carbratio"])
|
|
st.dataframe(
|
|
pd.DataFrame(ratio_rows).rename(
|
|
columns={"start": "Van", "end": "Tot", "value": "Ratio (g koolhydraten per E)"}
|
|
),
|
|
width="stretch",
|
|
hide_index=True,
|
|
)
|
|
|
|
st.caption(
|
|
f"Totale dagelijkse basaal: {total_daily_basal(profile['basal']):.1f} E "
|
|
"(volgens profielschema, exclusief tijdelijke aanpassingen)."
|
|
)
|