Tavalliset kalakalenterit (solunar, kuun vaiheet) on kehitetty vuoroveden voimakkaille merialueille. Itämerellä vuorovesi on alle 20 cm — se ei ohjaa siian käyttäytymistä mihinkään suuntaan. Yleiset säänäkökulmat eivät taas ota huomioon Saaronniemen geometriaa eivätkä kevätsiian biologiaa. Tämä työkalu yrittää korjata molemmat puutteet: pisteyttää Saaronniemen olosuhteet siten kuin ne oikeasti vaikuttavat siian rantasyöntiin.
Eurooppalainen siika (Coregonus lavaretus) on opportunistinen yleissyöjä, mutta kevään rantakalastuksen kannalta tärkeitä piirteitä ovat:
Tämä on kaikkien ennustettavien tekijöiden kuningas. Ei ilman lämpötila — veden lämpötila. Ilma on huono mittari rantaveden lämmöstä, koska vedellä on lämpöinertia ja matalat poukamat lämpenevät omaan tahtiinsa.
| Vedenlämpö | Tilanne rannalla |
|---|---|
| < 2 °C | Jää juuri lähtenyt; siika ei vielä syö rannalla |
| 2–4 °C | Käynnistymisvaihe; epävarmaa |
| 4–8 °C | Huippukausi — siika parveissa pohjasta |
| 8–12 °C | Kauden loppuvaihe; särki ja ahven tulevat |
| > 12 °C | Kausi käytännössä ohi |
Pisteytysmalli reagoi tähän kahdella tavalla: vesilämmölle on iso 20 % paino osatekijänä, ja sen päälle kovat kerroinrangaistukset jos vesi on alle 4 °C (×0.4) tai yli 12 °C (×0.5). Yksi kylmä vesi voi siis yksinään tiputtaa muuten hyvän päivän surkeaksi — kuten käytännössäkin.
Tärkeä vinkki: oma rannalta otettu mittaus on aina luotettavampi kuin malli. Open-Meteon avovesimalli on usein 2–3 °C lämpimämpi kuin matalan rannan oma vesi, varsinkin kylmän pohjois/luoteistuulen jälkeen. Käytä ennustesivun ”Oma havainto rannalla” -liukua kun on uusi mittaus.
Saaronniemen kärki (Kolkannokka) avautuu länsi/lounaan suuntaan, ja avoin Saaristomeri on etelässä ja lännessä. Tämä asettaa tuulet hyvin epäsymmetrisesti:
Tuulen voimakkuus on toinen ulottuvuus. Optimi on 2–6 m/s: riittää sekoittamaan pohjaa, ei sameuta vettä. Yli 14 m/s vesi sameutuu ja siika lakkaa näkemästä saalistaan. Aivan tyyni (alle 0.5 m/s) saa pisteytyksen 40 — se ei sekoita pohjaa, mutta sight-feedingille se ei myöskään ole este.
Kalastusperinteessä ”paine vaikuttaa kalan syöntihaluun” on yleinen uskomus. Biofysikaalisesti se on kuitenkin epätodennäköinen: koko sääjärjestelmän paine-ero (20–40 hPa) on pieni verrattuna siihen painevaihteluun, jonka kala itse tuottaa uimalla yhden metrin verran ylös tai alas (~100 hPa).
Mitä paineessa oikeasti kannattaa katsoa, on muutosnopeus. Se ei vaikuta suoraan kalaan vaan toimii välikätenä säämuutoksille — pilvisyydelle, tuulelle, lämpötilan vaihtelulle, sateelle. Nämä taas vaikuttavat siian syöntiin oikeasti.
Mallissa paineen muutosta katsotaan kahdella ikkunalla: 24 h (paino 12) ja 48 h (paino 6). Absoluuttinen paine ei tule mukaan lainkaan.
Pienet sateet (alle 2 mm/vrk) eivät juurikaan haittaa. Rankka sade sameuttaa veden ja blokkaa sight-feedingin; siika ei syö. Edellisten 48 h sateet ovat usein ratkaisevampia kuin kyseisen päivän — vesi tarvitsee aikaa kirkastua. Saaristomeren alhainen suolaisuus (5–7 ‰) tarkoittaa että makean veden valuma ei sokkilailla muuta suolaisuutta, mutta voi paikallisesti jäähdyttää.
Tämä on hieman vastakkainen mitä yleensä kuvitellaan. Aurinko ei pelästytä siikaa, vaan päinvastoin: aurinko lämmittää pohjasedimenttiä, mikä saa harvasukamadot möyrimään ja siika tulee parveissa pohjalle syömään niitä.
Yksityiskohtaiset kaavat ja painokertoimet löytyvät viereiseltä
Algoritmin spesifikaatio -välilehdeltä (englanniksi).
Lähteet ja laajempi tausta:
docs/research.md (FI) ja docs/methodology.md (EN).
Note (EN): this tab is the implementation spec for
developers. It is the single source of truth for the math used in
scoring.js. The angler-facing summary is on the previous tab
(in Finnish).
finalScore = clamp(round(baseScore × Π penaltyMultipliers), 0, 100)
where baseScore is a weighted average of 11 factor scores
(each 0–100) and penaltyMultipliers are zero or more
critical-condition multipliers (each ≤ 1).
A pure weighted average can't capture veto conditions — situations where a single factor (e.g. water below 4 °C, or +20 °C summer water) effectively shuts down the fishery regardless of everything else. A pure rule-based system can't capture gradual interactions between many small factors. The hybrid: weighted average of gradient factors, then hard penalty multipliers for the few biological vetoes.
| Key | Factor | Weight | Critical |
|---|---|---|---|
wt | Water temperature | 20 | ✓ |
wtrend | Water-temp trend (7-day Δ) | 10 | ✓ |
p24 | Pressure change 24h (|ΔhPa|) | 12 | |
p48 | Pressure change 48h (|ΔhPa|) | 6 | |
ws | Wind speed (max km/h) | 10 | |
wd | Wind direction (Saaronniemi-relative) | 10 | |
r24 | Precipitation 24h | 6 | |
r48 | Precipitation prior 48h | 6 | |
cc | Cloud cover (mean) | 6 | |
at | Air temperature (max) | 4 | |
att | Air-temp trend (48h Δ) | 10 | |
| Total | 100 | ||
baseScore = Σ(score × weight) / 100
triangular(v, hardLo, optLo, optHi, hardHi)v ≤ hardLo → 0 v ≥ hardHi → 0 optLo ≤ v ≤ optHi → 100 hardLo < v < optLo → linear ramp 0 → 100 optHi < v < hardHi → linear ramp 100 → 0
triangular(t, 2, 6, 10, 14). Optimum 6–10 °C, hard bounds 2 and 14.
| Δ over 7 days | Score |
|---|---|
| +1 to +4 °C (warming) | 100 |
| 0 to +1 °C (drift up) | 80 |
| > +4 °C (very fast warming) | 70 |
| 0 to −1 °C (slow cooling) | 65 |
| −1 to −2 °C | 35 |
| −2 to −3 °C | 15 |
| < −3 °C (crash) | 5 |
Sudden cooling in spring tells fish to leave the shallow shore for the deeper, more thermally stable column.
triangular(|dp|, 0, 3, 8, 15). Reward 3–8 hPa/24h; penalize
stagnant pressure (|Δp|<3) and extreme drops (|Δp|>15).
ms = kmh / 3.6 if ms < 0.5 → 40 (dead calm; sight feeding still fine) else → triangular(ms, 0, 2, 6, 14)
The cape opens W/SW. Best: SW (~225°) onshore. Worst: NE (~45°) offshore.
dist = min(|deg − 225|, 360 − |deg − 225|) // angular distance, 0–180 score = round(100 × (1 − dist / 180))
mm < 0.5 → 100 mm < 2 → 80 mm < 5 → 50 mm < 10 → 25 mm ≥ 10 → 10
mm < 2 → 100 mm < 8 → 70 mm < 20 → 40 mm ≥ 20 → 15
Piecewise (not triangular):
pct ≤ 10 → 85 (clear; great in spring, harsh in summer) pct ≤ 60 → 100 (broken cloud sweet spot) pct ≤ 80 → 70 pct ≤ 95 → 45 pct > 95 → 25 (overcast; bottom doesn't warm, polychaetes stay in)
triangular(tmax, -5, 6, 14, 22). Lower weight than water temp because air is a poor proxy for shore water on short timescales.
dt 0 to +5 → 100 (warming) dt > +5 → 70 (warming fast — confused fish) dt 0 to −2 → 70 (slight cool) dt −2 to −5 → 40 dt < −5 → 20 (cold shock)
Applied multiplicatively after the weighted base score. Multiple can stack.
| Condition | Multiplier | Rationale |
|---|---|---|
| Water temp < 4 °C | × 0.4 | Polychaete activity halts; siika moves to deep stable water. |
| Water temp 4–5 °C | × 0.6 | Cold-edge marginal — shore food chain barely active. |
| Water temp > 12 °C | × 0.5 | Spring whitefish window closes; roach/perch dominate the shallow shore. |
| Water trend ≤ −2.5 °C / 7d | × 0.5 | Sudden cooling — fish vacate the shallows for thermal stability. |
| Water trend −1.5 to −2.5 °C / 7d | × 0.75 | Cooling not catastrophic but biases against feeding. |
| WindDir score < 30 AND wind > 8 m/s AND water < 7 °C | × 0.7 | Cold offshore wind drives warm surface water out and brings cold deep water up. |
If multiple water-temp conditions match, only one fires (e.g. < 4 °C does not also trigger 4–5 °C). Trend and direction conditions stack with temperature conditions.
Open-Meteo Marine gives a daily SST forecast, but we don't currently use it directly per future day. Instead we project from today's chosen source using a damped air-temp delta:
projectedWater(d) = baseWater + (airAvg(d) − airAvg(today)) × 0.2 × min(daysFromToday, 5) / 5
Capped to [1, 18] °C. This is crude and known to be a weakness — a better implementation would use the Open-Meteo Marine forecast directly per future day.
One ground-truth event so far: 2026-04-24 user reports nobody catching fish at Saaronniemi, water shore-measured at 4 °C (down from 6–8 °C earlier weeks), wind from NW at 25 km/h. Without the water-temp + offshore-wind compound, the model gave 85 (very wrong). With them, the model gives 34 ("Huono"), matching reality. More catch-log data points are needed for real validation.
src/scoring.js — all formulas in this tab are implemented there as pure functions.docs/data-sources.md — three APIs (Open-Meteo Weather, Open-Meteo Marine, FMI WFS).docs/decisions.md — why each weight and threshold.docs/research.md — long-form Finnish notes that shaped the model.