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 load_range_data, 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() active_pct = sensor_active_percent(glucose, start, end) if active_pct < 70: st.warning( f"Slechts {active_pct:.0f}% sensordekking in deze periode (streefwaarde ≥70%). " "De onderstaande cijfers zijn mogelijk minder betrouwbaar door de vele hiaten." ) 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.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" )