import requests import streamlit as st from auth import require_auth from nightscout_client import NightscoutConfigError from reporting import ( gmi_percent, percent_cv, sensor_active_percent, tir_breakdown_5band, ) from ui_common import ( build_tir_stacked_bar_figure, get_colors, load_range_data, render_completeness_warning, select_period_days, ) st.set_page_config(page_title="Glucose dashboard โ€” Samenvatting", page_icon="๐Ÿ“Š", layout="wide") require_auth() st.title("Samenvatting") st.caption("AGP-stijl samenvattingsstatistieken over een gekozen periode (FR2, FR9).") start, end, days = select_period_days(default_label="90 dagen") try: glucose, _treatments = load_range_data(start, end) except NightscoutConfigError as exc: st.error(str(exc)) st.stop() except (requests.RequestException, ValueError) as exc: st.error(f"Kon geen data ophalen van Nightscout: {exc}") st.stop() if glucose.empty: st.info("Geen glucosemetingen gevonden in deze periode.") st.stop() render_completeness_warning(glucose, start, end) active_pct = sensor_active_percent(glucose, start, end) mean_mmol = glucose["mmol"].mean() gmi = gmi_percent(mean_mmol) cv = percent_cv(glucose) tir = tir_breakdown_5band(glucose) st.subheader("Kerncijfers") col1, col2, col3, col4 = st.columns(4) col1.metric("Sensordekking", f"{active_pct:.0f}%", help="Streefwaarde: โ‰ฅ70%") col2.metric("Gemiddelde glucose", f"{mean_mmol:.1f} mmol/L") col3.metric("Geschat HbA1c (GMI)", f"{gmi:.1f}%", help="Bergenstal et al. 2018 โ€” geen labwaarde") col4.metric("Variabiliteit (%CV)", f"{cv:.0f}%", help="Streefwaarde: โ‰ค36%") st.subheader("Tijd in bereik (5 klinische banden)") band_labels = { "very_low": "Zeer laag (<3.0)", "low": "Laag (3.0-3.9)", "in_range": "In bereik (3.9-10.0)", "high": "Hoog (10.0-13.9)", "very_high": "Zeer hoog (>13.9)", } band_targets = { "very_low": "<1%", "low": "<4% (samen met zeer laag)", "in_range": ">70%", "high": "<25% (samen met zeer hoog)", "very_high": "<5%", } cols = st.columns(5) for col, band in zip(cols, band_labels, strict=True): col.metric(band_labels[band], f"{tir[band]:.0f}%", help=f"Streefwaarde: {band_targets[band]}") st.plotly_chart(build_tir_stacked_bar_figure(tir, get_colors()), width="stretch") st.caption( f"Periode: {start.strftime('%d-%m-%Y')} t/m {end.strftime('%d-%m-%Y')} " f"({len(glucose)} metingen) ยท streefwaarden volgens Battelino et al. 2019" )