d81a150014508d38e4a84e899b84bb5e435d952d
Zivy incident home-01: aktivni plan mel ev_sessions:0, ac session bezela (target 70 %). Planovac neviděl ~6 kW zatez auta a spatne rozvrhl baterii (zbytecny vecerni import). Root cause (dve pasti): - fn_planning_site_context vracela session jako null, kdyz needed_wh=0 (auto nad targetem) i kdyz target_deadline is null. - _ev_session_from_json (Python) zahazovala session bez deadline. Fix: - R__038 fn_ev_session_planning_json: session se vyradi (null) JEN bez tvrdych dat (kapacita vozidla / soc_at_connect). target_deadline smi byt NULL -- solver hard deadline constraint aplikuje jen pri needed>0; oportunisticka vrstva bezi i bez deadline. Auto nad targetem zustava v planu jako znama zatez i s headroomem k levnemu doplneni. R__039 vola helper (deduplikace dvou inline poddotazu, SQL-first). - _ev_session_from_json si NULL deadline ponecha (energy_needed_wh default 0). - testy test_ev_session_parse.py; docs ev-charging + planning-changelog; CLAUDE.md funkce. Navrh agresivnejsiho oportunistickeho algoritmu (P50 levnych oken z market_price_stats misto konstanty 1 Kc/kWh) -- NEnasazeno, k rozhodnuti, sepsano v docs/04-modules/planning.md (EV oportunismus); riziko regrese golden ekonomiky, nutny EV fixture + eval. Overeni: pytest -q 362 passed; golden replay gate 7 passed; solver_v2_eval beze zmeny (fixtures bez EV session). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
EMS Platform
Systém pro správu energie fotovoltaické elektrárny s baterií, EV nabíječkami a tepelným čerpadlem. Optimalizuje náklady pomocí spotových cen OTE CZ.
Podrobná architektura, datový model a moduly jsou v docs/; stručná orientace pro vývoj je v CLAUDE.md.
Rychlý start
cp .env.example .env
# Uprav .env: DB_PASSWORD, POSTGREST_JWT_SECRET (min 32 znaků)
docker compose up --build -d
# Počkej ~45s na Flyway migrace a start služeb
bash scripts/smoke_test.sh
- UI: http://localhost
- API (FastAPI): http://localhost/api/v1 (případně přímo http://localhost:8000/api/v1)
- PostgREST: http://localhost/rest (případně http://localhost:3000)
Inicializace dat (první spuštění)
# 1. Import spotových cen OTE (zítřek v časové zóně lokality)
curl -X POST http://localhost/api/v1/sites/1/prices/import
# 2. PV forecast (Open-Meteo + pvlib → forecast_pv_interval)
curl -X POST http://localhost/api/v1/sites/1/forecast/run
# 3. Spustit optimalizaci (denní plán)
curl -X POST "http://localhost/api/v1/sites/1/plan/run?type=daily"
Ve webovém rozhraní: stránka Plánování a tlačítko Přeplánovat spouští rolling přepočet (vyžaduje již dostupné ceny a forecast v horizontu solveru).
Stack
| Komponenta | Technologie | Port |
|---|---|---|
| DB | PostgreSQL 16 + TimescaleDB | 5432 (mapováno na localhost, interně v síti Docker) |
| API | FastAPI + PostgREST | 80 přes Nginx (/api, /rest) |
| Frontend | React + Vite + Tailwind | 80 |
| Migrace | Flyway (db/migration, db/routines, db/views) |
— |
Co ještě nefunguje (před instalací HW)
- Telemetrie: IP adresy Waveshare (Modbus TCP) doplnit v DB / seedu (
db/migration/V003__seed_site_home01.sqlasite_endpoint). - EV nabíječky: Modbus registry Teltonika zatím často mock / rozpracované.
- Samsung TČ: Modbus registry pending (mock data).
- Loxone: nakonfigurovat Virtual Inputs dle
docs/loxone-integration.md.
Architektura
Description
Languages
Python
66.9%
TypeScript
19.4%
PLpgSQL
11.9%
Shell
1.4%
JavaScript
0.2%