Adds a soil moisture index view to the TUI, toggled with m. Uses an exponential-decay leaky-bucket model (decay=0.85, ≈4–5 day half-life) applied to daily rainfall totals to approximate soil moisture level for farm management decisions.
Changes
Database.get_moisture_index()— new DB method computing the leaky-bucket moisture time series, with the same grouping and pagination contract asget_rainChartModeenum andmkey binding — toggles the bar chart and stats panel between rainfall and moisture views- Stats panel header — always shows current mode (Rain/Moisture) and grouping (Daily/Weekly/Monthly/Yearly)
- Tentative moisture entries —
_compute_tentative_moisture_entriesgenerates decaying synthetic bars for days since the last DB record, showing soil drying in real time
Closes #9
Adds a soil moisture index view to the TUI, toggled with `m`. Uses an exponential-decay leaky-bucket model (decay=0.85, ≈4–5 day half-life) applied to daily rainfall totals to approximate soil moisture level for farm management decisions.
## Changes
- `Database.get_moisture_index()` — new DB method computing the leaky-bucket moisture time series, with the same grouping and pagination contract as `get_rain`
- `ChartMode` enum and `m` key binding — toggles the bar chart and stats panel between rainfall and moisture views
- Stats panel header — always shows current mode (Rain/Moisture) and grouping (Daily/Weekly/Monthly/Yearly)
- Tentative moisture entries — `_compute_tentative_moisture_entries` generates decaying synthetic bars for days since the last DB record, showing soil drying in real time
Closes #9