add Dagoverzicht, Hypo Events, and Hyper Events pages (FR4, FR5, FR6)

Dagoverzicht stacks one glucose trace per calendar day (small multiples
via a shared 0-24h x-axis). The two event pages share a new
render_event_level() helper in ui_common.py so Level 1/Level 2 hypo and
hyper are rendered identically: count/avg/longest/events-per-week
metrics, a time-of-day histogram, and a table of individual events.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
2026-07-26 20:13:38 +02:00
co-authored by Claude Sonnet 5
parent 1207ff536f
commit 04c5f521fe
4 changed files with 224 additions and 0 deletions
+45
View File
@@ -0,0 +1,45 @@
import requests
import streamlit as st
from auth import require_auth
from nightscout_client import NightscoutConfigError
from reporting import LOW, VERY_LOW
from ui_common import (
get_colors,
load_range_data,
render_event_level,
select_period_days,
)
st.set_page_config(page_title="Glucose dashboard — Hypo events", page_icon="📊", layout="wide")
require_auth()
st.title("Hypo events")
st.caption(
"Detectie van hypoglykemie-events volgens de persistentieregel (FR5): een event "
"telt pas na >=15 minuten ononderbroken onder de drempel, en eindigt pas na "
">=15 minuten ononderbroken herstel."
)
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()
colors = get_colors()
render_event_level(glucose, LOW, "below", f"Level 1 (<{LOW} mmol/L)", days, colors)
st.divider()
render_event_level(glucose, VERY_LOW, "below", f"Level 2 (<{VERY_LOW} mmol/L)", days, colors)
st.caption(f"Periode: {start.strftime('%d-%m-%Y')} t/m {end.strftime('%d-%m-%Y')}")