Initial commit
Made-with: Cursor
This commit is contained in:
187
docs/04-modules/consumption.md
Normal file
187
docs/04-modules/consumption.md
Normal file
@@ -0,0 +1,187 @@
|
||||
# Modul: Consumption (Spotřeba)
|
||||
|
||||
## Členění spotřeby
|
||||
|
||||
Systém rozlišuje dva typy spotřeby:
|
||||
|
||||
### 1. Bazální (neflexibilní) spotřeba
|
||||
- Spotřeba kterou nelze odložit ani řídit
|
||||
- Příklady: osvětlení, elektronika, vaření, cirkulační čerpadla
|
||||
- **Zdroj:** měřená telemetrie ze střídače (`load_power_w` - suma flexibilní spotřeby)
|
||||
- **Použití v plánování:** jako pevný vstup (musí být pokryta)
|
||||
|
||||
### 2. Flexibilní spotřeba
|
||||
- Spotřeba kterou lze časově přesunout nebo regulovat
|
||||
- Příklady: nabíjení EV, ohřev TUV, tepelné čerpadlo (při přetopení zásobníku)
|
||||
- **Zdroj:** telemetrie z konkrétních zařízení (EV nabíječky, stavové vstupy Loxone)
|
||||
- **Použití v plánování:** jako optimalizovatelná proměnná
|
||||
|
||||
---
|
||||
|
||||
## Jak se měří celková spotřeba
|
||||
|
||||
Střídač Deye poskytuje přes Modbus registr `load_power_w` = celková okamžitá spotřeba objektu (vše za hlavním jističem na AC straně střídače).
|
||||
|
||||
```
|
||||
load_power_w (Deye) = bazální_spotřeba + EV_nabíjení + TUV + ostatní flexibilní
|
||||
```
|
||||
|
||||
### Odvození bazální spotřeby
|
||||
|
||||
```
|
||||
bazální_w = load_power_w - sum(flexibilní zařízení aktuální výkon)
|
||||
```
|
||||
|
||||
V praxi:
|
||||
```
|
||||
bazální_w = load_power_w
|
||||
- ev_charger_1_power_w
|
||||
- ev_charger_2_power_w
|
||||
- tuv_power_w (pokud je měřitelná zvlášť)
|
||||
```
|
||||
|
||||
> **Předpoklad:** TUV výkon není přímo měřen, pouze víme že je ON/OFF (přes Loxone). Pokud je ON, odečítáme `asset_flexible_device.max_power_w`. Toto je zjednodušení – lze zpřesnit později podružným měřením.
|
||||
|
||||
---
|
||||
|
||||
## Ukládání spotřeby
|
||||
|
||||
### Real-time telemetrie
|
||||
Celková spotřeba je součástí `telemetry_inverter.load_power_w` (1min záznamy).
|
||||
|
||||
EV nabíječky mají vlastní tabulku `telemetry_ev_charger` s přesným výkonem.
|
||||
|
||||
### Agregovaná spotřeba pro plánování
|
||||
Tabulka `consumption_baseline_interval` ukládá 15min průměry bazální spotřeby:
|
||||
|
||||
- `data_type = 'actual'` – historická skutečnost (zpětně dopočítáno z telemetrie)
|
||||
- `data_type = 'forecast'` – predikce pro plánování
|
||||
|
||||
---
|
||||
|
||||
## Predikce bazální spotřeby
|
||||
|
||||
### Metoda: historický průměr + denní profil
|
||||
|
||||
Jednoduchý model pro začátek:
|
||||
|
||||
```python
|
||||
def forecast_baseline_consumption(site_id: int, target_date: date):
|
||||
"""
|
||||
Predikce bazální spotřeby na základě průměru posledních N podobných dní.
|
||||
Podobnost: stejný den v týdnu, přibližně stejná roční doba.
|
||||
"""
|
||||
lookback_weeks = 4
|
||||
day_of_week = target_date.weekday()
|
||||
|
||||
# Stáhnout historické bazální hodnoty pro stejné dny v týdnu
|
||||
historical = db.query("""
|
||||
SELECT interval_start, power_w
|
||||
FROM consumption_baseline_interval
|
||||
WHERE site_id = %s
|
||||
AND data_type = 'actual'
|
||||
AND EXTRACT(dow FROM interval_start) = %s
|
||||
AND interval_start >= %s
|
||||
ORDER BY interval_start
|
||||
""", site_id, day_of_week, target_date - timedelta(weeks=lookback_weeks))
|
||||
|
||||
# Průměr per 15min slot
|
||||
profile = aggregate_by_time_of_day(historical) # 96 hodnot (15min sloty)
|
||||
return profile
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Flexibilní zařízení – detailní popis
|
||||
|
||||
### EV nabíječky (Teltonika TeltoCharge 22kW)
|
||||
|
||||
**Komunikace:** Teltonika poskytuje REST API a/nebo OCPP protokol.
|
||||
|
||||
| Parametr | Hodnota |
|
||||
|---|---|
|
||||
| Max výkon | 22 000 W (třífázové) |
|
||||
| Min výkon (1 fáze) | 1 380 W |
|
||||
| Počet na home-01 | 2 |
|
||||
| Protokol | OCPP 1.6 nebo Teltonika REST API |
|
||||
|
||||
**Co systém řídí:**
|
||||
- Povolení/zakázání nabíjení (smart charging on/off)
|
||||
- Omezení výkonu (charge current limit v Amperech)
|
||||
- Časový plán nabíjení (nastavit okno kdy smí nabíjet)
|
||||
|
||||
**Telemetrie (stahuje se každou minutu):**
|
||||
- stav konektoru (available / charging / faulted)
|
||||
- aktuální výkon [W]
|
||||
- kumulativní energie [kWh]
|
||||
- proud [A], napětí [V]
|
||||
- session ID
|
||||
|
||||
**Plánování:**
|
||||
- EV se nabíjí v době levné energie nebo přebytku FVE
|
||||
- Respektuje požadavek uživatele: "nabitý na X % do Y hodin"
|
||||
- Pokud není požadavek nastaven → nabíjí při přebytku nebo nejlevnějším spotu
|
||||
|
||||
> **Otevřený bod:** Teltonika API vs OCPP – rozhodnout při první integraci. Doporučujeme OCPP pro standardizaci.
|
||||
|
||||
---
|
||||
|
||||
### TUV / Tepelné čerpadlo
|
||||
|
||||
**Komunikace:** přes Loxone (HTTP Virtual Input – zapnout/vypnout)
|
||||
|
||||
**Co systém řídí:**
|
||||
- Povolení ohřevu (Loxone přepne výstupní relé)
|
||||
- Systém pošle setpoint do Loxone, Loxone provede
|
||||
|
||||
**Telemetrie:**
|
||||
- Stav ON/OFF (čteme z Loxone HTTP výstupu nebo Virtual Output stavu)
|
||||
- Teplota zásobníku (pokud je čidlo v Loxone – doporučeno)
|
||||
- Aktuální výkon: není přímo měřen, používáme `max_power_w` z `asset_flexible_device`
|
||||
|
||||
**Plánování:**
|
||||
- TUV se ohřívá v době přebytku FVE nebo levného spotu
|
||||
- Minimální a maximální teplota zásobníku je respektována (pokud máme čidlo)
|
||||
- Nouzová priorita: pokud teplota pod minimum → ohřát bez ohledu na cenu
|
||||
|
||||
---
|
||||
|
||||
## Výpočet bazální spotřeby v auditu
|
||||
|
||||
```sql
|
||||
-- Agregovaná skutečná bazální spotřeba za 15min interval
|
||||
CREATE VIEW consumption_vw_actual_baseline AS
|
||||
SELECT
|
||||
t.site_id,
|
||||
time_bucket('15 minutes', t.measured_at) AS interval_start,
|
||||
AVG(
|
||||
t.load_power_w
|
||||
- COALESCE(ev1.power_w, 0)
|
||||
- COALESCE(ev2.power_w, 0)
|
||||
-- TUV: odečíst max_power pokud byl v daném intervalu aktivní
|
||||
) AS baseline_power_w
|
||||
FROM telemetry_inverter t
|
||||
-- JOIN na EV telemetrii
|
||||
GROUP BY t.site_id, time_bucket('15 minutes', t.measured_at);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Konfigurace (env proměnné)
|
||||
|
||||
```env
|
||||
CONSUMPTION_FORECAST_LOOKBACK_WEEKS=4
|
||||
TELTONIKA_API_URL_1=http://192.168.x.x/api # charger 1
|
||||
TELTONIKA_API_URL_2=http://192.168.x.x/api # charger 2
|
||||
TELTONIKA_POLL_INTERVAL_SEC=60
|
||||
TUV_DEFAULT_POWER_W=2000 # fallback pokud není měřeno
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Otevřené body
|
||||
|
||||
- [ ] Teltonika: OCPP vs REST API – rozhodnout před implementací
|
||||
- [ ] TUV teplota zásobníku: přidat čidlo do Loxone pro přesnější řízení
|
||||
- [ ] Bazální spotřeba: zpřesnit odečítání TUV výkonu (ON/OFF × čas vs pevný výkon)
|
||||
- [ ] Sezónní korekce predikce spotřeby (léto vs zima) – fáze 2
|
||||
Reference in New Issue
Block a user