Dusan Vojacek 815a233049
Some checks failed
CI and deploy / migration-check (push) Successful in 28s
CI and deploy / deploy (push) Failing after 17m56s
feat(telemetry): idle-skip zápisů — neukládat 1min řádky idle zařízení
Slabý server: dict (tabulka, asset_id) → (signature, last_stored_at);
_idle_skip ukládá vždy při změně signature, aktivitě, po startu procesu
a heartbeat po > 840 s (každý 15min bucket má ≥ 1 řádek).

- telemetry_ev_charger: aktivní = status != 'available' nebo power > 50 W;
  signature (status, výkon na 100 W)
- telemetry_pool_pump: aktivní = is_on nebo power > 5 W (ON řádky 1/min
  kvůli on_minutes); signature (is_on, výkon na 10 W)
- telemetry_loxone_sensor: jen změna hodnoty ≥ 0.1 / heartbeat
- telemetry_heat_pump: aktivní = mode != 'off' nebo defrost; signature
  (mode, teploty na 0.2 °C)
- telemetry_inverter: beze změny — NIKDY se nepřeskakuje (audit Wh split,
  baseline, SoC plánovače)

Detekce příjezdu/odjezdu EV: previous_status přesunut z posledního řádku DB
do in-memory _EV_LAST_STATUS (po startu seed z vw_latest_ev_charger —
přechod během výpadku se pozná, prázdná DB nevystřelí falešný příjezd);
fn_ev_session_transition se volá jen při změně statusu.

PoolCard: staleness práh 5 → 16 min (> heartbeat 840 s).
Docs: telemetry.md sekce „Idle-skip zápisů" (pravidla pro nové čtecí dotazy:
sumy/gapfill, ne avg přes řádky), planning-changelog (TUV °C/min).
Testy: tests/test_telemetry_idle_skip.py — _idle_skip jednotkově + EV
arrival/departure přežije skip i restart procesu (303 passed).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 19:06:41 +02:00
2026-06-06 22:41:56 +02:00
2026-05-15 23:03:32 +02:00
x
2026-03-20 14:30:03 +01:00

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

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.sql a site_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

Viz docs/02-architecture.md.

Description
No description provided
Readme 19 MiB
Languages
Python 66.9%
TypeScript 19.4%
PLpgSQL 11.9%
Shell 1.4%
JavaScript 0.2%