JÄRJESTELMÄARKKITEHTUURI · VERSIO 2.0
🌅 Päivärytmi
📱 Sivut & toiminnot
⚡ Datavirta
📡 Beast BLE
🎯 Jokainen painallus
🗺️ Yleiskuva
Tyypillinen urheilijapäivä — jokainen vaihe, jokainen painallus
06:30 — AUTOMAATTINEN
😴
Emfit QS lataa yöunidata
aalto_gas.js
  • GAS fetchEmfit() hakee REST API:sta: sleep_score, hrv_rmssd, deep_min, rem_min
  • Kirjoittaa Google Sheets "Uni"-välilehdelle
  • Laskee readiness-indeksin: HRV×0.45 + sleep_score×0.55
  • ACWR päivitetään: acute7 / chronic28 ratio
→ Data käytettävissä kaikilla sivuilla heti herätessä
08:00 — Avaa AALTO, Koti-sivu
🏠
Päivän tarina + Analyysi
index.html
  • Story-kortti: renderStory() → aamu-haara → "Palautuminen hyvä 👍 · Kuntosalipäivä"
  • Apple Watch -renkaat: drawRings() animoi ACWR/Valmius/Viikkokuorma
  • Analyysikortti: renderAnalysis() → avainluvut + 7pv sparkline + seuraava ottelu
  • Claude AI: fetch Haiku → henkilökohtainen 2-3 lause suomeksi
  • Kalenteri: renderCalendar() → 14pv grid, ottelu-päivät korostettuna
  • Klikkaa 🏋️ Aloita kuntosali →: navigoi simulaatio.html
→ Tietää mitä tehdä ilman lisäkysymyksiä
08:15 — Uni-sivu (valinnainen)
😴
Unianalyysi
uni.html
  • Sleep score -rengasvisualisointi (SVG animoitu)
  • HRV highlight: delta vs baseline, 14pv trendi
  • Univaiheet: Syvä / REM / Kevyt / Hereillä
  • Claude AI: "Uni 87/100, HRV 58ms — keho palautunut hyvin. Kovaa treeniä voi harjoitella."
  • Dynaamiset parannusehdotukset datasta
→ Ymmärtää palautumistilansa ennen treeniä
15:00 — Kuntosali (Beast Sensor)
🏋️
VBT Sali-sessio
simulaatio.html
  • 🔗 Yhdistä Beast: Web Bluetooth scan → GATT connect → Nordic UART
  • Lämmittely: 50% → 70% 1RM, timerit automaattisesti
  • Työsarjat: Beast lähettää nopeus per toisto → animateRep() reaaliajassa
  • Velocity drop: >10% → keltainen varoitus, >20% → punainen stop
  • ⏹ Lopeta sarja: finishSet() → AI coach analysoi sarjan
  • Palautumisajastin: 3:00 countdown + paino-suositus seuraavaan
  • Sessio valmis: AU lasketaan, tallennetaan Google Sheetsiin
→ VBT ohjaa kuormitusta täsmälleen oikealle tasolle
15:45 — Lentopallotreeni
🏐
Ohjattu sessio
sessio.html
  • CMJ esimittaus: hyppykorkeus cm kirjataan, verrataan baselineen
  • 6-vaiheinen harjoitus: Lämmittely → Vastaanotto → Hyökkäys → Peli → CMJ loppu
  • Drill-timerit: countdown ring (canvas) per harjoitusvaihe
  • Intensiteettivalinta: Kevyt / Normaali / Kova
  • AI coaching: typewriter-animaatio per vaihe
  • Ravintosuositus: 3 tasoa fatigue × ottelupäivät
→ CMJ-muutos kertoo neuromuskulaarisesta tilasta
20:00 — Wellness-kirjaus
🩺
Päivän check-in
terveys.html
  • Mieliala: 5 emoji-nappia (😫→😄), tallentuu automaattisesti
  • DOMS: Lihasarkuus 0–5 slider
  • Stressi: Stressitaso 1–5 + käyttäytymismerkit
  • Kuukautiskierto: Vaihe → hormonaalinen konteksti ACWR:lle
  • Tallenna: saveWellness() → kirjoittaa Google Sheetsiin
→ <3 min / päivä — kokonaiskuorma täydellinen
23:00 — Ilta-analyysi
📊
GAS laskee ACWR
aalto_gas.js
  • calcACWR() ajaa kaikille pelaajille: acute7 / chronic28
  • Kirjoittaa "ACWR"-välilehdelle
  • Lähettää Telegram-hälytyksen jos ACWR > 1.5
  • Päivittää ennuste 14pv kuormamalliin
→ Huomisen story-kortti on jo laskettu ennen heräämistä
14
HTML-sivua
3
JS-tiedostoa
130
KB ZIP
100%
Offline PWA
8500+
Riviä koodia
Päänavigaatio (kaikilla sivuilla)
🏠
Koti
index.html · 1035L
Story-kortti · Apple Watch -renkaat · Päivän analyysi (ACWR/HRV/Uni/Viikkokuorma) · Kalenteri-preview · 14pv ohjelma · Pikakirjaus
🏋️ Aloita kuntosali 📅 Kalenteri → kalenteri.html ⚙ Asetukset 🧠 AI analyysi
Sessio
sessio.html · 736L
CMJ esimittaus · 6-vaiheinen ohjattu harjoitus · Drill-timerit · Intensiteettiasetus · AI coaching · Ravintosuositus · Session tallennus
▶ Aloita sessio ⏱ Countdown-ring 1/2/3 Intensiteetti 🧠 AI vaihekohtainen
🩺
Terveys
terveys.html · 462L
Mieliala-emojit · DOMS lihasarkuus · Stressi-seuranta · Kuukautiskierto (hormonaalinen konteksti) · Päiväkirja-historia
😫😕😐🙂😄 Mieliala DOMS 0–5 ✓ Tallenna
🤖
AI Coach
chat.html · 403L
Claude Haiku chat · Konteksti ACWR+HRV+sessiot · Pikakysymykset · Markdown rendering · Viesti-historia sessioittain
📊 ACWR selitys 💪 Tänään? ⚠ Ylikuormitus → Lähetä viesti
Lisää-menu (⋯)
🏋️
Sali / VBT
simulaatio.html · 1396L
Beast BLE yhdistäminen · DUP Power Day · Lämmittely automaattisesti · VBT kyykky reaaliajassa · Velocity drop seuranta · AI sarjaanalyysi · Lisäliikkeet
🔗 Yhdistä Beast ▶ Aloita sessio ⏹ Lopeta sarja 🧠 AI coach
😴
Uni
uni.html · 399L
Sleep score ring · HRV RMSSD + delta + 14pv trendi · Univaiheet palkki · Leposyke · AI palautumisanalyysi · Dynaamiset uniohjeet
HRV trendi 14pv sparkline 🧠 AI analyysi
📅
Kalenteri
kalenteri.html · 438L
Kuukausigrid värikoodattuna · Kuukausistatistiikka · Napauta päivää → tapahtumat+uni · Tulevat ottelut · 28pv kuormaheatmap
← Edell. kuukausi Napauta päivää → Seur. kuukausi
📊
Kausidata
kausi.html · 206L
ACWR kausikaari 12 viikkoa · Viikkokuorma tyypeittäin (pylväät) · Ottelujen sijainti · Loukkaantumisriski-alue korostettu
ACWR-graafi Kuormakaavio
👥
Valmentaja
valmentaja.html · 194L
Joukkueen ACWR per pelaaja · Hälytykset (ylikuormitus) · Viikon yhteenveto · AI valmentaja-analyysi · CSV-vienti
↻ Päivitä 🧠 AI analyysi ⬇ CSV
📈
Viikkoraportti
viikko.html · 376L
Edellinen/tämä/seuraava viikko · Sessiot + AU + hyppykorkeus + HRV per päivä · AI viikkoanalyysi · CSV-vienti
← Edell. viikko 🧠 AI viikko ⬇ CSV
📉
Kehitys
kehitys.html · 424L
CMJ-hyppytrendi · HRV-kehitys · Suorituskykyvertailu kilpailijoihin (WHOOP/Catapult) · Profiilikortti
CMJ-trendi HRV-kehitys Vertailu
🔮
Ennuste
ennuste.html · 392L
Loukkaantumisriskiindeksi · ACWR-ennuste 14pv · Riskitekijät yksitellen · Suositukset kuorman säätöön · AI riskianalyysi
Riski-donitsi 14pv ennuste 🧠 AI riski
💪
DUP-ohjelma
ohjelma.html · 195L
Daily Undulating Periodization · Viikko 1–4 · Voima/Hypertrofia/Nopeus kierrät · Prosentit 1RM-pohjainen · Lentopallo-spesifi
Viikko 1–4 ▶ Aloita päivä
Täydellinen datavirta sensoreista näyttöön
ANTURIT / LAITTEISTO
😴
Emfit QS
Vuodesensori · REST API · klo 06:30 automaattinen haku
→ sleep_score, hrv_rmssd, resting_hr, deep_min, rem_min
📡
Beast Sensor
IMU barbell tracker · Web Bluetooth BLE · Nordic UART
→ velocity m/s, power W, ROM cm per toisto
Manuaalikirjaus
RPE 1–10 · session kesto · CMJ cm · mieliala · DOMS · stressi
→ terveys.html, sessio.html, simulaatio.html
Emfit: REST → GAS · Beast: BLE → selain · Manuaali: form → GAS
BACKEND (Google Apps Script)
⚙️
doGet()
Reititys: action=getData → palauttaa JSON kaikki data yhdellä kutsulla (JSONP CORS-bypass)
📊
calcACWR()
acute7 = viim. 7pv AU-summa
chronic28 = viim. 28pv ka
ACWR = acute7 / chronic28
😴
fetchEmfit()
Triggeröity klo 06:30
REST API → Sheet "Uni"
readiness = HRV×.45 + score×.55
🔔
Telegram alert
ACWR > 1.5 → valmentajalle
Uni score < 55 → urheilijalle
Google Sheets: 10 välilehteä — Sessions, Uni, ACWR, Wellness, Matches...
AI-KERROS (Claude Haiku)
🏠
index.html
Päivän analyysi
Konteksti: ACWR, HRV, uni, viikkokuorma, ottelu, putki
😴
uni.html
Palautumisanalyysi
Konteksti: sleep score, HRV delta, 14pv trendi, leposyke
sessio.html
Vaihekuotsausta
Konteksti: CMJ muutos, fatigue, vaihe, intensiteetti
🏋️
simulaatio.html
Sarjaanalyysi
Konteksti: velocity drop %, sarja#, paino, ottelu-etäisyys
🤖
chat.html
Vapaa chat
Konteksti: kaikki data + sessiohistoria
Kaikki data → AALTO PWA (Cloudflare Pages, offline-tuki)
UI (14 sivua, aalto.css design system)
🏠
Koti
Story · Renkaat · Analyysi · Kalenteri
Sessio
CMJ · 6 vaihetta · AI
🏋️
Sali
Beast BLE · VBT
😴
Uni
HRV · Stages · Trendi
📅
+ 10 muuta
Kalenteri · Ennuste · Chat · Kehitys · Valmentaja...
Beast Sensor BLE -integraatio — jokainen vaihe
1
📡
Beast päälle
LED vilkkuu
2
🔗
Napauta Yhdistä
Chrome BLE scan
3
🔍
Laitevalinta
Valitse "Beast-XXXXX"
4
🤝
GATT Connect
Nordic UART service
5
🔔
Notifikaatiot
TX char subscribe
6
LIVE DATA
m/s per toisto
BLE paketti → AALTO prosessointi
// Beast lähettää per toisto (Nordic UART TX):
{"v":0.68,"p":850,"rom":0.42} ← JSON
0.68 ← tai pelkkä float string

// AALTO prosessoi (beastHandleRep):
vel = d.v || d.vel || d.velocity || d.mean_velocity
peak = d.peak || d.peak_velocity || vel
// Filter noise:
if (vel < 0.05 || vel > 3.0) return

// Sessio aktiivinen → Beast Mode:
beastActivate() ← peruuttaa sim-timers
beastDriveRep(vel) ← animateRep() oikealla datalla
SET_DATA[currentSet].vels[beastRepIdx] = vel
beastRepIdx++

// Velocity drop check:
drop = (vels[0] - vel) / vels[0] * 100
if (drop > 20) showToast("PYSÄYTÄ SARJA")
UUID-konfiguraatio (päivitä nRF Connect -skannauksella)
// simulaatio.html → const BEAST = {
SERVICE: '6e400001-b5a3-f393-e0a9-e50e24dcca9e' ← Nordic UART
TX_CHAR: '6e400003-b5a3-f393-e0a9-e50e24dcca9e' ← notifty FROM beast
RX_CHAR: '6e400002-b5a3-f393-e0a9-e50e24dcca9e' ← write TO beast
// Jos ei yhdisty → avaa nRF Connect → skannaa Beast → kopioi UUID:t tänne
Koti-sivu (index.html) — kaikki interaktiot
PAINIKE / ELEMENTTIFUNKTIOMITÄ TAPAHTUU
⚙ AsetuksetopenModal('modal-settings')Avaa settings-modal: nimi, pelipaikka, jump baseline, API key
Story-nappi (🏋️ / 🏐)location.hrefNavigoi simulaatio.html tai sessio.html tilanteen mukaan
Kalenteri-korttilocation.href='kalenteri.html'Avaa täysi kuukausikalenteri
EMFIT UNI -tekstilocation.href='uni.html'Avaa unisivu
14pv ohjelman ▶ nappilocation.hrefNavigoi tämän päivän sessioon
Pikakirjaus-ruutuopenQL(type)Avaa quick-log modal: kesto, RPE, muistiinpano
⋯ LisääopenMore()Slide-up menu 8 sivuun
Sali-sessio (simulaatio.html) — kaikki interaktiot
PAINIKEFUNKTIOMITÄ TAPAHTUU
🔗 Yhdistä BeastbeastConnect()Web Bluetooth scan → GATT → Nordic UART subscribe
▶ Aloita sessiostartSession()Hakee Emfit-data, laskee 1RM, aloittaa lämmittelyn
Lämmittely → SeuraavaadvanceWarmup()50% → 70% → työsarjat, joka vaihe omalla timeritaan
⏹ Lopeta sarjafinishSet()Laskee velocity drop, AI analysoi, aloittaa 3min palautuksen
PalautumistimerautomaattinenCountdown 3:00 → seuraavan sarjan paino-suositus
Sessio valmis → TallennasaveSession()Kirjoittaa GAS:n kautta Sheetsiin, päivittää ACWR
🔌 KatkaisebeastDisconnect()Katkaistaan BLE, palataan simulaatio-moodiin
Ohjattu sessio (sessio.html) — kaikki interaktiot
PAINIKEFUNKTIOMITÄ TAPAHTUU
CMJ kirjaa (cm)setCMJ()Vertaa baselineen → neuromuskulaarinen status
1 / 2 / 3 IntensiteettisetIntensity(n)Säätää harjoituksen kuormitustason
▶ Aloita vaihestartPhase()Countdown-ring alkaa, AI coaching typewriter-animaatio
⏭ Seuraava vaihenextPhase()CMJ → Lämmittely → Vastaanotto → Hyökkäys → Peli → Loppu
CMJ loppumittaussetEndCMJ()Laskee muutos% → väsymysindeksi
✓ Tallenna sessiosaveSession()AU, hyppykorkeus, kesto → Google Sheets
Kalenteri (kalenteri.html) — kaikki interaktiot
PAINIKEFUNKTIOMITÄ TAPAHTUU
← Edellinen kuukausichangeMonth(-1)viewMonth--, renderCalendar() uudelleen
→ Seuraava kuukausichangeMonth(1)viewMonth++, renderCalendar() uudelleen
Napauta päivääselectDay(dateStr)Päivitä selected-class, renderöi tapahtumat + unidata alla
Heatmap-palkkishowTip() / selectDay()Tooltip AU-arvo, napauta → valitsee päivän
Tuleva otteluselectDay(date)Scrollaa kalenteriin, näyttää ottelun tiedot
AALTO v2.0 — Järjestelmän yleiskuva
AALTO on suomenkielinen lentopalloilijan henkilökohtainen kuormanhallintajärjestelmä. Se yhdistää kolme datalähdettä — Emfit QS vuodesensori (uni/HRV), Beast Sensor (VBT/CMJ) ja manuaalikirjaus — Claude Haiku AI-analytiikkaan, tarjoten urheilijalle reaaliaikaisen palautumisindeksin ja kuormaoptimoidun päivittäisen suosituksen.
LAITTEISTO
😴 Emfit QS — vuodesensori, REST API
📡 Beast Sensor — BLE, VBT reaaliajassa
Manuaali — RPE, CMJ, wellness
BACKEND
⚙️ Google Apps Script — serverless
📊 Google Sheets — 10 välilehteä
🔔 Telegram — hälytykset ACWR > 1.5
TEKOÄLY
🧠 Claude Haiku 4.5 — 5 sivulla
📝 Konteksti: ACWR + HRV + ottelu + putki
🇫🇮 Kieli: suomi, lämmin valmentajasävy
FRONTEND
📱 14 sivua — PWA, offline-tuki
☁️ Cloudflare Pages — HTTPS, CDN
🎨 Design system — aalto.css, WCAG AA
Tekniset vaatimukset
KOMPONENTTITEKNOLOGIAVERSIO / HUOMIO
AI-malliclaude-haiku-4-5-20251001max_tokens: 200, suomi, oma API-avain
Beast BLEWeb Bluetooth APIChrome 70+ · MacOS/Android · ei iOS
Emfit APIREST HTTPSqs-api.emfit.com/api/v1, device ID
BackendGoogle Apps ScriptdoGet/doPost, JSONP, klo 06:30 trigger
TietokantaGoogle Sheets10 välilehteä, SHEET_ID konfiguroitavissa
HostingCloudflare Pagesaalto.pages.dev, HTTPS, ei serveriä
FontitJetBrains Mono + DM SansGoogle Fonts CDN
OfflinePWA Service Workermanifest.json, start_url: /index.html