# Analýza energetických toků (Fáze 2)

## Účel

Stránka **Toky** (`/energy-flows`) zobrazuje **modelované** směrové toky energie mezi FVE, sítí, baterií a spotřebou za den / měsíc. Nejedná se o přímé měření větví u střídače, ale o **prioritní alokaci** z minutové telemetrie.

## Výpočet

Funkce `ems.fn_fill_audit_interval` pro každý 15min slot:

1. Načte minutové řádky `ems.telemetry_inverter` (`pv_power_w`, `load_power_w`, `grid_power_w`, `battery_power_w`).
2. Pro každou minutu aplikuje alokaci (pořadí): PV → spotřeba → nabíjení baterie → export; pak vybití baterie → spotřeba / export; síť → zbytek spotřeby a nabíjení.
3. Součet výkonů × 1/60 h = Wh za slot; výsledek v sloupcích `flow_*_wh` v `ems.audit_interval`.

**Import / export ze sítě (`actual_grid_import_wh` / `actual_grid_export_wh`):** nejprve se bere delta z Deye registrů `grid_import_total_wh` / `grid_export_total_wh` (pokud je k dispozici), jinak součet kladných resp. záporných dílů z `grid_power_w` po minutách. Okamžitě poté `fn_fill_audit_interval` sjednotí hodnoty funkcemi `ems.fn_audit_grid_import_wh_for_economics` / `fn_audit_grid_export_wh_for_economics`: při **jednosměrném** toku v slotu (typicky jen import nebo jen export podle uložených Wh) vezme **maximum** z čítače a z odhadu `max(0, P_grid) × ¼ h` resp. `|min(0, P_grid)| × ¼ h` z průměrného `grid_power_w` — u některých instalací lifetime čítač Deye **rostl pomaleji** než integrál z výkonu, takže bez této úpravy ekonomika a záložka **Ekonomika** podhodnocovaly kWh. Při **obousměrném** toku ve stejném 15min slotu (obě strany &gt; 0 Wh) se uložený split z čítače/per-minute **nemění**.

Sloupce: `flow_pv_to_load_wh`, `flow_pv_to_batt_wh`, `flow_pv_to_grid_wh`, `flow_batt_to_load_wh`, `flow_batt_to_grid_wh`, `flow_grid_to_load_wh`, `flow_grid_to_batt_wh`.

Základní 6 Wh veličin (import/export, PV, baterie, load) zůstává ve Fázi 1; toky jsou nadstavba.

## API

- `GET /api/v1/sites/{site_id}/energy-flows/daily?month=YYYY-MM` — kromě toků vrací denní součty **financí sítě**: `grid_import_cashflow_czk`, `grid_export_revenue_czk` (jako `vw_economics_interval`, join na `vw_site_effective_price`) a nákladový rozpad importu `grid_to_load_cost_czk` / `grid_to_batt_cost_czk` (efektivní nákupní cena × modelovaný tok).
- `GET /api/v1/sites/{site_id}/energy-flows/daily/{day}/intervals`

## SQL

- View `ems.vw_energy_flows_daily` – denní agregace z `audit_interval`.
- PostgREST role `ems_anon`: `GRANT SELECT` na `vw_energy_flows_daily` (viz repeatable grants).

## UI

- Sankey (`@nivo/sankey`) – součet toků za **celý měsíc** nebo za **jeden vybraný den** (rozbalovací pole „Graf a karty“; klik na název dne v tabulce také přepne den). Síť je ve vizualizaci rozdělena na **Import ze sítě** a **Export do sítě** (jinak by vznikl cyklus síť↔baterie a knihovna hlásí „circular link“).
- Pět perspektivních karet: FVE, síť, baterie, spotřeba a **financí** (nákup/prodej v Kč, průměrná cena Kč/kWh, rozpad nákladů importu do spotřeby vs. baterie; stejný měsíční/denní rozsah jako Sankey).
- Tabulka dnů s rozbalením na 15min intervaly.

## Backfill

Po nasazení migrace V042 a opakovatelné rutiny:

```sql
SELECT ems.fn_fill_audit_range(<site_id>, '<od>'::timestamptz, now());
```
