Dubbelklicka på Starta_jupyterlab.bat i Scripts-mappen.
JupyterLab öppnas automatiskt i Chrome på http://localhost:8888/lab
OBS: Om du kör från Proton Drive och får "Server Connection Error" mitt i sessionen –
prova att flytta bsl_analys.ipynb till en lokal mapp (t.ex. C:\BSL\) och kör därifrån.
Proton Drive-synkning kan störa JupyterLab vid autosave.
Dubbelklicka på Export_notebook.bat i Scripts-mappen.
Kör hela notebooken och exporterar bsl_rapport_YYYY-MM-DD.html till Rapporter\-mappen,
öppnar den i Chrome. Tar 2–4 minuter (kör om hela notebooken från scratch).
garmin_upload.py (och garmin_upload_gisela.py när Gisela har data)bsl_upload.py (och bsl_upload_gisela.py om inmatning gjorts)Starta_jupyterlab.batbsl_analys.ipynbKernel → Restart & Run AllNATT_DATUM vid behovDAG_DATUM vid behovbsl_analys.ipynb i JupyterLab filpanel → Close and Shutdown Notebookbsl_analys_DATUM.ipynb (säkerhetskopia)bsl_analys.ipynbKernel → Restart & Run AllOBS: Bara stänga fliken räcker inte – kerneln lever kvar. Alltid Close and Shutdown.
Ladda alltid upp din bsl_analys.ipynb när du startar en ny session med Claude
om du vill göra ändringar. Annars jobbar Claude mot en gammal version.
bsl_kontext.md – projektöversikt och datamodellbsl_halsa.md – hälsoprofil och sömnanalysbsl_notebook_setup.md – denna filbsl_sql.md – SQL-kommandon för Supabase| Cell | Innehåll |
|---|---|
| 0 | Rubrik (version + ändringslogg) |
| 1-2 | Installation |
| 3-4 | Konfiguration + Supabase-anslutning |
| 5-6 | Hämta data (logg, hv, kost, iv, gp, gs, pollen) med paginering |
| 7-8 | Förbered analysdata: ps, natt_stats, df, kost-aggregering, pollen-merge |
| 9-10 | Aggregera huvudvark_log → df |
| 11-12 | Parametrar (FRÅN_DATUM, TILL_DATUM, RULLANDE_FÖNSTER, VISA_RULLANDE) |
| 13-14 | Hjälpfunktioner (rullande, filtrera_period, formatera_xaxel, rita_interventioner) |
| 15-16 | Graf 1 – Nattpuls + sömntid (egen_total från somnade/steg_upp/langd_uppvaknanden) |
| 17-18 | Graf 2 – Vilofas (puls <56) vs Garmin djupsömn |
| 19-20 | Graf 3 – Pulsavvikelser |
| 21-22 | Sammanfattning |
| 23-24 | BSL Sleep Score v4 |
| 25 | Graf 5 – Sleep Score tidsserie |
| 26-27 | Graf 6 – Nattlig pulsstabilitet (SD p80) + Pulsro + Andel <50 bpm |
| 28-29 | Korrelationsanalys (15 faktorer inkl. 10 pollentyper) |
| 30 | Nästa steg |
| 31-32 | Graf 7 – Nattpuls vs pollen (POLLEN_NR = [1,2] etc) |
| 33-34 | Nattgraf (ändra NATT_DATUM, kör Shift+Enter) |
| 35 | (tom) |
| 36 | Markdown: Daggraf |
| 37-38 | Daggraf (ändra DAG_DATUM, kör Shift+Enter) |
| 39 | Markdown: Sektion 16 |
| 40 | Graf 8 – Vikt |
| 41 | Graf 9 – Steg per dag |
| 42 | Graf 10 – Kalorier: förbrukning vs intag |
| 43 | Graf 11 – Proteinintag |
| 44 | Markdown: Sektion 17 |
| 45 | Graf 12 – Dagtidspuls över tid (median + P5-P95 + aktiv andel) |
| 46 | Graf 13 – Zontrend dagtid 08-20 (Vila+Z1 / Z2-Z5, linjer) |
| 47 | Markdown: Sektion 18 |
| 48 | Graf 14 – Nattzontrend 22-08 (Djup vila+Vila / Förhöjd+Vaken+Uppvaknande) |
| 49-50 | Diagnostik – täckning per user_id/datum/natt_datum i garmin_puls (v3.19) |
Versionshistorik: - v3.17 (2026-05-13) – baseline med alla 14 grafer - v3.18 (2026-05-14) – USER_ID-filter på alla personliga tabeller (förberedelse för flera användare) - v3.19 (2026-05-15) – diagnostikcell sist (täckning per user_id/datum/natt_datum)
| Komp | Beskrivning | Viktning |
|---|---|---|
| A | Insomningslugn – puls <65 kl 22 | 1/6 |
| B | Störningsfrihet – timing-viktad (22-01 x2, 01-04 x1.5, 04-08 x1) | 1/6 |
| C | Djupfas – andel puls <56 bpm | 1/6 |
| D | Stabilitet – SD på lägsta 80% av pulsvärden (exkl. uppvakningspikar) | 1/6 |
| F | Uppvaknanden – 0=1.0, 1-2=0.85, 3=0.50, 4+=0.20 | 1/6 |
| G | Sömntid – steg_upp minus somnade minus langd_uppvaknanden, mål 8h | 1/6 |
Score = medel(A,B,C,D,F,G) × 5 → skala 0-5
Datum-konvention: Kvällen (22:00–) från dagen INNAN uppvakningsdatumet. Morgonen (–08:00) från uppvakningsdatumet.
Välj pollentyp med nummer i POLLEN_NR-parametern, kör cellen med Shift+Enter:
# 1=Gräs 2=Björk 3=Al 4=Sälg och viden 5=Hassel
# 6=Gråbo 7=Ek 8=Alm 9=Malörtsambrosia 10=Bok
POLLEN_NR = [1, 2]
Maxpuls för zonberäkning: MAXPULS = 170 (justeras när cykeldata finns).
Dagtidsfönster: DAG_FONSTER_START = 8, DAG_FONSTER_SLUT = 20.
Zoner baserade på absolut puls (inte % av maxpuls): | Zon | bpm | Tolkning | |---|---|---| | Djup vila | <50 | Optimal restorativ sömn | | Vila | 50-55 | Bra sömnpuls | | Förhöjd | 56-62 | Lätt aktiverat | | Vaken/lätt | 63-75 | Klart aktiverat | | Uppvaknande | >75 | Vaken eller stress |
datum och natt_datum i garmin-tabeller är generated columns – skickas INTE i upload-payloadlokal_tid är enda fältet Python skickar för tidstämplar(user_id, lokal_tid) – idempotent uppladdningdaglig_logg.datum = uppvakningsdatum = natt_datum för föregående nattgarmin_puls.natt_datum = daglig_logg.datumnbconvert installerat i AppData\Roaming\Python\Python314\site-packages
– används som python -m nbconvert (inte python -m jupyter nbconvert)bsl_upload.py eller garmin_upload.py uppdateras: synka *_gisela.py också. Vanliga buggar vid kopiering: glömd FIT_MAPP-väg (pekar på Indata istället för Indata_Gisela), saknad on_conflict-parameter i upload-funktionen. På sikt bör de slås ihop till ett skript med --user som argument.Daglig kontroll: Kolla nattgrafen varje morgon. Biologiskt rimlig puls = mjuka kurvor med enstaka toppar vid uppvaknanden. Kaotiska oscillationer eller abrupt avslut = varningstecken.
:44-sekunders artefakter (SpO2-sensor) Pulsvärden med sekund=44 i lokal_tid är artefakter. Filtreras automatiskt i garmin_upload.py.
Garmin skapar flera WELLNESS-filer per dag. Alla måste finnas i Indata-mappen för komplett data. Om förmiddagsdata saknas – kontrollera att alla filer för datumet är uppladdade.
Sleep Score-buggar att känna till (lösta i v2.4–v3.5): - datum-kolumner kan ha olika precision (datetime64[us] vs [ns]) – normaliseras till [ns] - F-komponenten kräver int(float(n_vak)) för numpy.float64 - Deduplicera scorer med drop_duplicates(subset=['datum'], keep='first')