fix telemtrie na dahsbaordu (15min misto 1h)
Some checks failed
deploy / deploy (push) Failing after 1m42s
test / smoke-test (push) Successful in 2s

This commit is contained in:
Dusan Vojacek
2026-04-10 20:48:41 +02:00
parent 920d9ff40c
commit eb8dd0368f
11 changed files with 131 additions and 23 deletions

View File

@@ -82,6 +82,7 @@ ems-platform/
views/
R__vw_site_effective_price.sql
R__vw_latest_telemetry.sql
R__vw_telemetry_15m_7d.sql
R__vw_actual_baseline.sql
R__vw_audit_summary.sql
R__vw_heat_pump_cop_history.sql

View File

@@ -266,6 +266,15 @@ CREATE TABLE telemetry_inverter (
-- SELECT create_hypertable('telemetry_inverter', 'measured_at');
```
### Continuous aggregates a views (výkon střídače pro UI)
Z `telemetry_inverter` počítá TimescaleDB materializované agregáty (viz `db/migration/V011__indexes_and_aggregates.sql`, `V039__telemetry_inverter_15m_aggregate.sql`):
- **`telemetry_inverter_hourly`** hodinové průměry + `LAST(battery_soc_percent, measured_at)`; čtení přes view **`vw_telemetry_hourly_7d`**.
- **`telemetry_inverter_15m`** čtvrthodinové bucket odpovídající 15min slotům EMS; čtení přes **`vw_telemetry_15m_7d`** (definice v **`db/views/R__vw_telemetry_15m_7d.sql`**, repeatable).
PostgREST role `ems_anon``SELECT` na tyto views (ne na samotné CA); u view nad CA je `security_invoker = false`, stejně jako u `vw_telemetry_hourly_7d` (viz `db/views/R__z_postgrest_ems_anon_grants.sql`).
### `telemetry_ev_charger`
Stav EV nabíječek.

View File

@@ -142,6 +142,21 @@ GROUP BY site_id, time_bucket('15 minutes', measured_at);
---
## Timescale continuous aggregates (střídač → dashboard)
Nad `ems.telemetry_inverter` běží dva **continuous aggregate** (TimescaleDB); oba se periodicky obnovují (řádově každých 15 minut). Definice CA je ve **verzovaných** migracích (`V011`, `V039`); **view** nad CA držíme v **repeatable** souborech (`db/views/R__*.sql`), aby šla měnit jedna aktuální definice bez nové V migrace.
| Objekt | Bucket | View pro PostgREST / UI | Poznámka |
|--------|--------|-------------------------|----------|
| `ems.telemetry_inverter_hourly` | 1 hodina | `ems.vw_telemetry_hourly_7d` | CA a view v **V011**; `security_invoker` v **V031**. Hodinové trendy. |
| `ems.telemetry_inverter_15m` | 15 minut | `ems.vw_telemetry_15m_7d` | **`db/views/R__vw_telemetry_15m_7d.sql`** posledních 7 dní, zarovnání s 15min sloty přehledu. |
**Frontend přehled** (`frontend/src/hooks/useDashboardData.ts`): skutečné výkony a SoC po slotech bere z **`/vw_telemetry_15m_7d`** (klíč slotu = začátek 15min intervalu v UTC, stejně jako `floorSlotUtcMs` v grafu). Horní karty a **aktuální SoC** v grafu jsou dál z **`vw_site_status`** (poslední 1min vzorek) a z WebSocketu `/ws/telemetry`, aby „teď“ odpovídalo boxu i po refreshi agregátu.
**Plánovač** počáteční SoC nečte z těchto view bere poslední řádek z `ems.telemetry_inverter` (`planning_engine._load_site_context`).
---
## Konfigurace (env proměnné)
```env