8.8 KiB
CLAUDE.md – EMS Platform (Cursor Agent)
Čti před každou implementační změnou. Stručná orientace; detail v docs/ a SQL v db/.
1. Co to je
Multi-site Energy Management System: optimalizuje FVE, baterii a flexibilní zátěž (EV, TČ) podle spotových cen OTE CZ a předpovědí; výstupy řídí zařízení (Modbus) a informuje Loxone jako exekutora. Referenční lokalita v seedu: home-01 (Deye, baterie, 2× EV Teltonika, Samsung TČ).
2. Technologický stack
| Vrstva | Technologie |
|---|---|
| DB | PostgreSQL 16 + TimescaleDB |
| Migrace | Flyway (db/migration, db/routines, db/views) |
| API | PostgREST (REST ze schématu ems) + FastAPI (logika, joby – plán v docs) |
| Frontend | React + TypeScript + Vite (očekáváno u kořene / Docker) |
| Pole / zařízení | Modbus TCP (pymodbus), HTTP (Loxone, případně API vozidel) |
| Solver | PuLP + HiGHS (HiGHS_CMD) |
| Runtime | Docker Compose |
3. Adresářová struktura
| Cesta | Účel |
|---|---|
CLAUDE.md, .env.example, docker-compose.yml |
Kořen: pravidla, env šablona, compose |
docs/ |
Produktová a technická specifikace (overview, architektura, datový model, integrace) |
docs/04-modules/ |
Modulové specifikace (ceny, forecast, spotřeba, TČ, telemetrie, řízení, plánování, režimy, EV) |
docs/loxone-integration.md |
Loxone watchdog, heartbeat, role exekutora |
docs/06-open-questions.md |
Nedokončené rozhodnutí – doplňovat místo hádání |
db/migration/ |
Flyway versioned migrace V00x__*.sql (schéma, seed, alter) |
db/routines/ |
Repeatable SQL: funkce ems.fn_* |
db/views/ |
Repeatable SQL: view ems.vw_* |
backend/services/ |
Python služby (v repozitáři zatím hlavně plánování) |
4. Pravidla – NIKDY neporušovat
-
15min logika pro plán/ceny/baseline/audit/forecast intervaly. Časové řady v těchto doménách = 15min sloty. Telemetrie zařízení je 1min (hypertables) – agregace do 15min přes SQL/job, ne ukládat „hodinové“ řádky jako primární plánovací záznam.
-
Všechny doménové záznamy vázat na
site_id(telemetrie, plány, audit, konfigurace aktiv, session, …). Výjimka:market_interval_priceje globální pro zdroj/trh; vazba na site je přes konfiguraci a view. -
Raw ceny ≠ efektivní ceny.
ems.market_interval_price= bez marží. Efektivní nákup/prodej jen přesems.vw_site_effective_price(join na platnousite_market_config). -
Loxone = exekutor + autonomní fallback, ne optimalizátor. Logika a plán v EMS. Watchdog v Loxone nesmí záviset na čtení DB (
site_heartbeatje jen pro EMS UI/diagnostiku). -
FVE pole B (
controllable = false, typicky ongrid GEN) – žádný curtailment. Curtailment jen pole A (Deye). Solver smí omezovat jenpv_a; pole B má zelený bonus (site_market_config.green_bonus_*, auditpv_b_production_wh/green_bonus_czk). -
Záporná prodejní cena →
grid_export == 0v LP (hard constraint). -
Záporná nákupní cena → omezit import na realistický horní strop (viz
solve_dispatchvplanning_engine.py– nesmí „nekonečný“ import). -
PuLP + HiGHS pro dispatch; žádný návrat k greedy
fn_plan_dayjako primárnímu řešení (SQL wrapper může zůstat pro uložení výsledků – dle docs). -
Deye Modbus: čtení i zápis (setpointy). RS485→Waveshare→TCP, knihovna
pymodbus. -
Přepínání provozního režimu přes DB API /
ems.fn_set_mode– držet konzistenci soperating_mode_defa Loxoneloxone_mode_value.
5. Schéma ems – tabulky (jedna věta)
| Tabulka | Popis |
|---|---|
site |
Lokalita (časová zóna, GPS, aktivita). |
site_endpoint |
Endpointy: Modbus, Loxone HTTP, atd. |
site_market_config |
Marže, režimy cenění, zelený bonus; časová platnost. |
site_grid_connection |
Limity import/export, no_export, rezervovaný výkon. |
site_override |
Manuální přepisy nad plánem (JSON + platnost). |
site_operating_mode |
Aktuální provozní režim na site (1 řádek/site). |
site_operating_mode_log |
Historie přepnutí režimů. |
site_heartbeat |
Poslední EMS heartbeat pro dashboard (ne pro Loxone watchdog). |
operating_mode_def |
Číselník režimů (baterie/síť/EV/TČ, hodnota pro Loxone). |
asset_inverter |
Střídač (výkony, endpoint, zda řiditelný). |
asset_battery |
Baterie vázaná na střídač (SoC limity, účinnosti, degradace). |
asset_pv_array |
FVE pole (Wp, orientace, curtailable vs ne). |
asset_ev_charger |
Nabíječka EV (výkony, fáze, endpoint). |
asset_heat_pump |
TČ (výkon, COP ref, limity běhu, TUV parametry). |
asset_vehicle |
Vozidlo (kapacita, max AC výkon, default target SoC/deadline). |
market_interval_price |
Raw spot OTE (15min), bez marží. |
telemetry_inverter |
1min telemetrie střídače (Timescale). |
telemetry_ev_charger |
1min telemetrie nabíječky (Timescale). |
telemetry_heat_pump |
1min telemetrie TČ (Timescale). |
forecast_pv_run |
Metadata běhu predikce FVE. |
forecast_pv_interval |
Predikovaný výkon FVE po 15min (Timescale). |
forecast_weather_interval |
Počasí 15min pro site (Timescale). |
forecast_correction_log |
Log korekcí forecastu vs skutečnost při rolling replanu. |
planning_run |
Jeden běh plánovače (daily/rolling/manual, stav, parametry solveru). |
planning_interval |
Výstup solveru po 15min (baterie, síť, EV, TČ, curtailment A). |
audit_interval |
Skutečnost vs plán po 15min (náklady, odchylky, bonus pole B). |
consumption_baseline_interval |
Bazální spotřeba actual/forecast 15min (Timescale). |
ev_session |
Nabíjecí session na WB (deadline, energie, náklady). |
View / funkce (nejsou tabulky): vw_site_effective_price, vw_latest_telemetry, vw_audit_summary, vw_operating_mode; fn_effective_price, fn_cop_estimate, fn_fill_audit_interval, fn_set_mode.
6. Periodické úlohy backendu (APScheduler / smyčky)
Specifikace z docs/02-architecture.md, modulových docs a komentářů v planning_engine.py. V gitu je zatím rozpracovaný backend – joby mají být v backend/app/main.py (zatím často chybí).
| Úloha | Frekvence | Poznámka |
|---|---|---|
telemetry_collector |
každých 60 s | Smyčka polling Modbus (Deye, EV×2, TČ) – viz docs/04-modules/telemetry.md |
price_importer |
14:00 denně + 00:05 kontrola | docs/04-modules/market-prices.md (časy CET v dokumentaci) |
forecast_service |
14:30 + 06:00 denně | docs/04-modules/forecast.md |
run_daily_plan |
15:00 denně | backend/services/planning_engine.py (horizont 36 h) |
run_rolling_replan |
každých 15 min (*/15) |
planning_engine.py – přepočet od aktuálního slotu |
control_exporter |
každých 15 min (slot boundary) | docs/04-modules/control.md |
audit_filler / fn_fill_audit_interval |
každých 15 min | docs/02-architecture.md, DB fn_fill_audit_interval |
7. Kde hledat co
| Chci… | Kam |
|---|---|
| Pochopit systém end-to-end | docs/01-overview.md, docs/02-architecture.md |
| Tabulky, vazby, jednotky | docs/03-data-model.md |
| OTE ceny, marže, efektivní cena | docs/04-modules/market-prices.md, db/views/R__vw_site_effective_price.sql |
| FVE forecast, počasí | docs/04-modules/forecast.md |
| Bazální spotřeba | docs/04-modules/consumption.md |
| TČ, COP, TUV | docs/04-modules/heat-pump.md, db/routines/R__fn_cop_estimate.sql |
| Modbus, telemetrie, agregace | docs/04-modules/telemetry.md |
| Export setpointů, Loxone HTTP | docs/04-modules/control.md, docs/loxone-integration.md |
| LP solver, rolling replan, korekce FVE | docs/04-modules/planning.md, backend/services/planning_engine.py |
| Provozní režimy AUTO / SELF_SUSTAIN / … | docs/04-modules/operating-modes.md, db/migration/V004__operating_modes.sql, R__fn_set_mode.sql |
| EV, session, deadline charging | docs/04-modules/ev-charging.md, db/migration/V006__vehicles.sql |
| Curtailment A, zelený bonus B | db/migration/V005__planning_curtailment.sql |
| Rolling plán, forecast log | db/migration/V007__rolling_replanning.sql |
| Audit 15min | db/routines/R__fn_fill_audit_interval.sql, docs/04-modules/telemetry.md |
| Nové sloupce / tabulky | nový db/migration/V00x__*.sql + případně db/routines / db/views |
| Nespecifikované chování | docs/06-open-questions.md (přidat otázku, neimpl. naslepo) |
Konvence (krátce)
- Python:
snake_case, type hints, Pydantic pro API modely. - SQL:
snake_case, explicitní FK; Flyway pořadíV###__/ repeatableR__. - Výkon W, energie Wh, ceny Kč/kWh; čas v DB
TIMESTAMPTZ(UTC).