TapHome

OKTE Spotové ceny

Packet Parser → HTTP
Přidal
Poslední aktualizace: 03. 2026

OKTE (Organizátor krátkodobého trhu s elektřinou) je slovenský organizátor trhu s elektřinou. Zveřejňuje spotové ceny na denním trhu (DAM) — hodinovou velkoobchodní cenu elektřiny v EUR/MWh určenou aukcí předchozího dne.

Šablona TapHome získává tyto ceny z veřejného API OKTE (isot.okte.sk) přes HTTP Packet Parser. Poskytuje cenu za aktuální hodinu, pořadí cen, výpočty min/max/průměru a analýzu časového okna — vše se aktualizuje automaticky každou hodinu. Není potřeba žádná autentifikace.

Konfigurace

Šablona se připojuje na isot.okte.sk přes HTTPS (port 443). Není potřeba IP adresa ani přihlašovací údaje — koncový bod je veřejné API.

Během importu šablony lze nastavit dvě volitelné vlastní proměnné:

  • Od — počáteční hodina vlastního časového okna (0–23, výchozí: 9)
  • Do — koncová hodina vlastního časového okna (0–23, výchozí: 17)

Tyto proměnné ovládají varianty zařízení „v časovém okně". Výchozí hodnoty (9–17) pokrývají standardní pracovní hodiny. Pokud nejsou potřeba, ponechte je na výchozích hodnotách — zařízení pro celý den fungují nezávisle.

Jak to funguje

Modul se dotazuje API OKTE DAM jednou za hodinu (interval 3600 s). Požadavek API používá dnešní datum:

1
GET /api/v1/dam/results?deliveryDayFrom={today}&deliveryDayTo={today}

Odpověď obsahuje pole cenových objektů, každý s číslem period a cenou price v EUR/MWh. V závislosti na denní době a harmonogramu zveřejňování OKTE může odpověď obsahovat ceny jen za dnešek (24 period) nebo až za 3 dny (72 period).

Každý skript zařízení parsuje toto JSON pole pomocí PARSEJSON(output, "$..price") a aplikuje třídící, filtrační nebo agregační funkce k odvození hodnoty.

Schopnosti zařízení

Šablona vystavuje 13 senzorových zařízení. Všechna jsou pouze pro čtení — hodnoty odvozují ze stejné odpovědi API.

Aktuální cena a pořadí
  • Aktuální cena — spotová cena za aktuální hodinovou periodu v EUR/MWh. Skript určí aktuální index periody z NOW() a vrátí odpovídající cenu z pole.
  • Pořadí aktuální periody — pořadí ceny aktuální hodiny mezi všemi dostupnými periodami (1 = nejlevnější). Užitečné pro automatizační pravidla jako „zapni tepelné čerpadlo jen když je aktuální hodina mezi 8 nejlevnějšími."
  • Pořadí aktuální periody v časovém okně — stejné jako výše, ale omezené na uživatelem definované okno Od–Do. Vrací NaN pokud je aktuální hodina mimo okno nebo pokud Od >= Do.
Cenové extrémy
  • Nejvyšší cena dne — maximální spotová cena ze všech dostupných period
  • Nejnižší cena dne — minimální spotová cena ze všech dostupných period
  • Nejvyšší cena v časovém okně — maximální cena v rámci okna Od–Do
  • Nejnižší cena v časovém okně — minimální cena v rámci okna Od–Do
Průměry
  • Průměrná cena dne — aritmetický průměr všech dostupných cen period
  • Průměrná cena v časovém okně — aritmetický průměr v rámci okna Od–Do
Identifikace period
  • Nejlevnější perioda dne — 1-založené číslo periody nejlevnější hodiny (např. 3 znamená 02:00–03:00)
  • Nejlevnější zbývající perioda — nejlevnější hodina od aktuální hodiny dále. Dynamicky se aktualizuje během dne.
Počty
  • Počet period — celkový počet cenových period v odpovědi API (typicky 24 nebo 72)
  • Počet period v časovém okně — počet period v rámci okna Od–Do

Atributy služby

Modul vystavuje až 96 atributů služby (Perioda 1 až Perioda 96), z nichž každý zobrazuje spotovou cenu pro danou hodinovou periodu jako řetězec s příponou „EUR". V praxi je vyplněno 24 atributů pro jeden den nebo 72 pro tři dny.

Tyto atributy poskytují kompletní cenový harmonogram viditelný v detailním zobrazení modulu TapHome.

Vlastní proměnné (Od / Do)

Několik zařízení má varianty „v časovém okně", které filtrují cenová data na podmnožinu hodin. Okno je definováno dvěma vlastními proměnnými nastavenými během importu šablony:

  • Od — počáteční hodina (včetně), hodnota 0–23
  • Do — koncová hodina (bez ní), hodnota 0–23

Například nastavení Od=8 a Do=16 analyzuje ceny pouze mezi 08:00 a 16:00. To je užitečné když chcete optimalizovat spotřebu energie během konkrétních hodin — například spouštět spotřebiče jen během nejlevnějších hodin pracovního dne.

Pokud Od >= Do, všechna okenní zařízení vracejí NaN.

Příklady automatizace

Spouštění zařízení během nejlevnějších hodin

Použijte zařízení Pořadí aktuální periody v podmínce smart rule. Například pro spuštění bazénového čerpadla jen během 6 nejlevnějších hodin dne:

  • Podmínka: Pořadí aktuální periody <= 6
  • Akce: Zapni bazénové čerpadlo
Vyhýbání se špičkovým cenám

Použijte zařízení Aktuální cena s prahovou hodnotou:

  • Podmínka: Aktuální cena > 150 (EUR/MWh)
  • Akce: Vypni nepodstatné zátěže
Optimalizace časového okna

Nastavte Od=22, Do=6 pro definování nočního okna, poté použijte Nejnižší cena v časovém okně nebo Pořadí aktuální periody v časovém okně k naplánování nabíjení baterie nebo provozu ohřívače vody během nejlevnějších nočních hodin.

Řešení problémů

Všechna zařízení zobrazují nulu nebo žádná data
  1. Zkontrolujte internetové připojení na TapHome Core — šablona vyžaduje odchozí HTTPS přístup na isot.okte.sk
  2. Ověřte, že API odpovídá — otevřete https://isot.okte.sk/api/v1/dam/results?deliveryDayFrom=2026-03-28&deliveryDayTo=2026-03-28 v prohlížeči
  3. Ceny DAM pro následující den se typicky zveřejňují po 12:45 CET. Před zveřejněním požadavky na zítřejší datum vracejí prázdné výsledky.
Okenní zařízení vracejí NaN
  1. Ověřte, že Od < Do v parametrech importu šablony
  2. Zkontrolujte, že aktuální hodina spadá do rozsahu Od–Do (pro Pořadí aktuální periody v časovém okně)
  3. Pamatujte, že Od a Do používají 24hodinový formát (0–23)
Hodnoty cen se zdají nesprávné

OKTE zveřejňuje ceny v EUR/MWh. Pro převod na EUR/kWh (domácnostní rozsah) vydělte 1000. Šablona zobrazuje surové hodnoty z API bez konverze.

Dostupná zařízení

OKTE Spotové ceny Modul
Servisní atributy
Period 1
Period 2
Period 3
Period 4
Period 5
Period 6
Period 7
Period 8
Period 9
Period 10
Period 11
Period 12
Period 13
Period 14
Period 15
Period 16
Period 17
Period 18
Period 19
Period 20
Period 21
Period 22
Period 23
Period 24
Period 25
Period 26
Period 27
Period 28
Period 29
Period 30
Period 31
Period 32
Period 33
Period 34
Period 35
Period 36
Period 37
Period 38
Period 39
Period 40
Period 41
Period 42
Period 43
Period 44
Period 45
Period 46
Period 47
Period 48
Period 49
Period 50
Period 51
Period 52
Period 53
Period 54
Period 55
Period 56
Period 57
Period 58
Period 59
Period 60
Period 61
Period 62
Period 63
Period 64
Period 65
Period 66
Period 67
Period 68
Period 69
Period 70
Period 71
Period 72
Period 73
Period 74
Period 75
Period 76
Period 77
Period 78
Period 79
Period 80
Period 81
Period 82
Period 83
Period 84
Period 85
Period 86
Period 87
Period 88
Period 89
Period 90
Period 91
Period 92
Period 93
Period 94
Period 95
Period 96
Vlastní proměnné
From (numeric) = 9Start hour (0–23) of the time window for windowed price ranking and statistics
To (numeric) = 17End hour (0–23) of the time window for windowed price ranking and statistics

okte.sk

Čtení (modul)
VAR today := tostring(NOW(), "yyyy-MM-dd");;
VAR response := SENDHTTPREQUEST("/api/v1/dam/results?deliveryDayFrom=" + today + "&deliveryDayTo=" + today);
IF response.IsSuccess
    output := response.Content;
ELSE
    ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
END
Servisní atributy
Perióda 1
PARSEJSON(output, "$[?(@.period == 1)].price") + " EUR"
Perióda 2
PARSEJSON(output, "$[?(@.period == 2)].price") + " EUR"
Perióda 3
PARSEJSON(output, "$[?(@.period == 3)].price") + " EUR"
Perióda 4
PARSEJSON(output, "$[?(@.period == 4)].price") + " EUR"
Perióda 5
PARSEJSON(output, "$[?(@.period == 5)].price") + " EUR"
Perióda 6
PARSEJSON(output, "$[?(@.period == 6)].price") + " EUR"
Perióda 7
PARSEJSON(output, "$[?(@.period == 7)].price") + " EUR"
Perióda 8
PARSEJSON(output, "$[?(@.period == 8)].price") + " EUR"
Perióda 9
PARSEJSON(output, "$[?(@.period == 9)].price") + " EUR"
Perióda 10
PARSEJSON(output, "$[?(@.period == 10)].price") + " EUR"
Perióda 11
PARSEJSON(output, "$[?(@.period == 11)].price") + " EUR"
Perióda 12
PARSEJSON(output, "$[?(@.period == 12)].price") + " EUR"
Perióda 13
PARSEJSON(output, "$[?(@.period == 13)].price") + " EUR"
Perióda 14
PARSEJSON(output, "$[?(@.period == 14)].price") + " EUR"
Perióda 15
PARSEJSON(output, "$[?(@.period == 15)].price") + " EUR"
Perióda 16
PARSEJSON(output, "$[?(@.period == 16)].price") + " EUR"
Perióda 17
PARSEJSON(output, "$[?(@.period == 17)].price") + " EUR"
Perióda 18
PARSEJSON(output, "$[?(@.period == 18)].price") + " EUR"
Perióda 19
PARSEJSON(output, "$[?(@.period == 19)].price") + " EUR"
Perióda 20
PARSEJSON(output, "$[?(@.period == 20)].price") + " EUR"
Perióda 21
PARSEJSON(output, "$[?(@.period == 21)].price") + " EUR"
Perióda 22
PARSEJSON(output, "$[?(@.period == 22)].price") + " EUR"
Perióda 23
PARSEJSON(output, "$[?(@.period == 23)].price") + " EUR"
Perióda 24
PARSEJSON(output, "$[?(@.period == 24)].price") + " EUR"
Perióda 25
PARSEJSON(output, "$[?(@.period == 25)].price") + " EUR"
Perióda 26
PARSEJSON(output, "$[?(@.period == 26)].price") + " EUR"
Perióda 27
PARSEJSON(output, "$[?(@.period == 27)].price") + " EUR"
Perióda 28
PARSEJSON(output, "$[?(@.period == 28)].price") + " EUR"
Perióda 29
PARSEJSON(output, "$[?(@.period == 29)].price") + " EUR"
Perióda 30
PARSEJSON(output, "$[?(@.period == 30)].price") + " EUR"
Perióda 31
PARSEJSON(output, "$[?(@.period == 31)].price") + " EUR"
Perióda 32
PARSEJSON(output, "$[?(@.period == 32)].price") + " EUR"
Perióda 33
PARSEJSON(output, "$[?(@.period == 33)].price") + " EUR"
Perióda 34
PARSEJSON(output, "$[?(@.period == 34)].price") + " EUR"
Perióda 35
PARSEJSON(output, "$[?(@.period == 35)].price") + " EUR"
Perióda 36
PARSEJSON(output, "$[?(@.period == 36)].price") + " EUR"
Perióda 37
PARSEJSON(output, "$[?(@.period == 37)].price") + " EUR"
Perióda 38
PARSEJSON(output, "$[?(@.period == 38)].price") + " EUR"
Perióda 39
PARSEJSON(output, "$[?(@.period == 39)].price") + " EUR"
Perióda 40
PARSEJSON(output, "$[?(@.period == 40)].price") + " EUR"
Perióda 41
PARSEJSON(output, "$[?(@.period == 41)].price") + " EUR"
Perióda 42
PARSEJSON(output, "$[?(@.period == 42)].price") + " EUR"
Perióda 43
PARSEJSON(output, "$[?(@.period == 43)].price") + " EUR"
Perióda 44
PARSEJSON(output, "$[?(@.period == 44)].price") + " EUR"
Perióda 45
PARSEJSON(output, "$[?(@.period == 45)].price") + " EUR"
Perióda 46
PARSEJSON(output, "$[?(@.period == 46)].price") + " EUR"
Perióda 47
PARSEJSON(output, "$[?(@.period == 47)].price") + " EUR"
Perióda 48
PARSEJSON(output, "$[?(@.period == 48)].price") + " EUR"
Perióda 49
PARSEJSON(output, "$[?(@.period == 49)].price") + " EUR"
Perióda 50
PARSEJSON(output, "$[?(@.period == 50)].price") + " EUR"
Perióda 51
PARSEJSON(output, "$[?(@.period == 51)].price") + " EUR"
Perióda 52
PARSEJSON(output, "$[?(@.period == 52)].price") + " EUR"
Perióda 53
PARSEJSON(output, "$[?(@.period == 53)].price") + " EUR"
Perióda 54
PARSEJSON(output, "$[?(@.period == 54)].price") + " EUR"
Perióda 55
PARSEJSON(output, "$[?(@.period == 55)].price") + " EUR"
Perióda 56
PARSEJSON(output, "$[?(@.period == 56)].price") + " EUR"
Perióda 57
PARSEJSON(output, "$[?(@.period == 57)].price") + " EUR"
Perióda 58
PARSEJSON(output, "$[?(@.period == 58)].price") + " EUR"
Perióda 59
PARSEJSON(output, "$[?(@.period == 59)].price") + " EUR"
Perióda 60
PARSEJSON(output, "$[?(@.period == 60)].price") + " EUR"
Perióda 61
PARSEJSON(output, "$[?(@.period == 61)].price") + " EUR"
Perióda 62
PARSEJSON(output, "$[?(@.period == 62)].price") + " EUR"
Perióda 63
PARSEJSON(output, "$[?(@.period == 63)].price") + " EUR"
Perióda 64
PARSEJSON(output, "$[?(@.period == 64)].price") + " EUR"
Perióda 65
PARSEJSON(output, "$[?(@.period == 65)].price") + " EUR"
Perióda 66
PARSEJSON(output, "$[?(@.period == 66)].price") + " EUR"
Perióda 67
PARSEJSON(output, "$[?(@.period == 67)].price") + " EUR"
Perióda 68
PARSEJSON(output, "$[?(@.period == 68)].price") + " EUR"
Perióda 69
PARSEJSON(output, "$[?(@.period == 69)].price") + " EUR"
Perióda 70
PARSEJSON(output, "$[?(@.period == 70)].price") + " EUR"
Perióda 71
PARSEJSON(output, "$[?(@.period == 71)].price") + " EUR"
Perióda 72
PARSEJSON(output, "$[?(@.period == 72)].price") + " EUR"
Perióda 73
PARSEJSON(output, "$[?(@.period == 73)].price") + " EUR"
Perióda 74
PARSEJSON(output, "$[?(@.period == 74)].price") + " EUR"
Perióda 75
PARSEJSON(output, "$[?(@.period == 75)].price") + " EUR"
Perióda 76
PARSEJSON(output, "$[?(@.period == 76)].price") + " EUR"
Perióda 77
PARSEJSON(output, "$[?(@.period == 77)].price") + " EUR"
Perióda 78
PARSEJSON(output, "$[?(@.period == 78)].price") + " EUR"
Perióda 79
PARSEJSON(output, "$[?(@.period == 79)].price") + " EUR"
Perióda 80
PARSEJSON(output, "$[?(@.period == 80)].price") + " EUR"
Perióda 81
PARSEJSON(output, "$[?(@.period == 81)].price") + " EUR"
Perióda 82
PARSEJSON(output, "$[?(@.period == 82)].price") + " EUR"
Perióda 83
PARSEJSON(output, "$[?(@.period == 83)].price") + " EUR"
Perióda 84
PARSEJSON(output, "$[?(@.period == 84)].price") + " EUR"
Perióda 85
PARSEJSON(output, "$[?(@.period == 85)].price") + " EUR"
Perióda 86
PARSEJSON(output, "$[?(@.period == 86)].price") + " EUR"
Perióda 87
PARSEJSON(output, "$[?(@.period == 87)].price") + " EUR"
Perióda 88
PARSEJSON(output, "$[?(@.period == 88)].price") + " EUR"
Perióda 89
PARSEJSON(output, "$[?(@.period == 89)].price") + " EUR"
Perióda 90
PARSEJSON(output, "$[?(@.period == 90)].price") + " EUR"
Perióda 91
PARSEJSON(output, "$[?(@.period == 91)].price") + " EUR"
Perióda 92
PARSEJSON(output, "$[?(@.period == 92)].price") + " EUR"
Perióda 93
PARSEJSON(output, "$[?(@.period == 93)].price") + " EUR"
Perióda 94
PARSEJSON(output, "$[?(@.period == 94)].price") + " EUR"
Perióda 95
PARSEJSON(output, "$[?(@.period == 95)].price") + " EUR"
Perióda 96
PARSEJSON(output, "$[?(@.period == 96)].price") + " EUR"
Aktuální cena Proměnná Pouze ke čtení

Spotová cena za aktuální hodinovou periodu v EUR/MWh — dynamicky určená z pole cen na základě aktuálního času

numeric Jednotka: EUR json_path

Aktuální cena

Čtení
var prices := PARSEJSON(output, "$..price");
VAR date := NOW();
var periodHour := LENGTH(prices) / 24;	
var actualperiod := FLOOR(((date.hour * 60) + date.minute) * periodHour / 60);

GETAT(prices, actualperiod)
Pořadí aktuální periody Proměnná Pouze ke čtení

Pořadí ceny aktuální hodiny mezi všemi periodami (1 = nejlevnější hodina dne)

numeric json_path

Pořadí aktuální periody

Čtení
var prices := PARSEJSON(output, "$..price");
var byPrice := ORDERINDEX(prices);
VAR date := NOW();
var periodHour := LENGTH(prices) / 24;	
var actualperiod := FLOOR(((date.hour * 60) + date.minute) * periodHour / 60);

INDEXOF(byPrice, actualperiod) + 1
Pořadí aktuální periody v časovém okně Proměnná Pouze ke čtení

Pořadí ceny aktuální hodiny v rámci uživatelem definovaného časového okna Od–Do — vrací NaN mimo okno

numeric json_path

Pořadí aktuální periody v časovém okně

Čtení
VAR date := NOW();
IF date.hour < From or date.hour > To or From >= To
	RETURN(NaN);
ELSE
	var prices := PARSEJSON(output, "$..price");
	var periodHour := LENGTH(prices) / 24;
	var windowPrices := COPY(prices, From * periodHour, (To - From) * periodHour);
	var byPrice := ORDERINDEX(windowPrices);
	
	var actualperiod := FLOOR(((date.hour * 60) + date.minute) * periodHour / 60);

	RETURN(INDEXOF(byPrice, actualperiod - From * periodHour) +1);
END
Nejvyšší cena dne Proměnná Pouze ke čtení

Maximální spotová cena ze všech dostupných period (EUR/MWh)

numeric Jednotka: EUR json_path

Nejvyšší cena dne

Čtení
var prices := PARSEJSON(output, "$..price");
GETAT(ORDERDESC(prices), 0)
Nejvyšší cena v časovém okně Proměnná Pouze ke čtení

Maximální spotová cena v rámci uživatelem definovaného časového okna Od–Do (EUR/MWh)

numeric Jednotka: EUR json_path

Nejvyšší cena v časovém okně

Čtení
VAR date := NOW();
IF From >= To
	RETURN(NaN);
ELSE
	var prices := PARSEJSON(output, "$..price");
	var periodHour := LENGTH(prices) / 24;	
	var actualperiod := FLOOR(((date.hour * 60) + date.minute) * periodHour / 60);
	var windowPrices := COPY(prices, From * periodHour, (To - From) * periodHour);
	var byPrice := ORDERDESC(windowPrices);

	RETURN(GETAT(byPrice, 0));
END
Nejnižší cena dne Proměnná Pouze ke čtení

Minimální spotová cena ze všech dostupných period (EUR/MWh)

numeric Jednotka: EUR json_path

Nejnižší cena dne

Čtení
var prices := PARSEJSON(output, "$..price");
GETAT(ORDER(prices), 0)
Nejnižší cena v časovém okně Proměnná Pouze ke čtení

Minimální spotová cena v rámci uživatelem definovaného časového okna Od–Do (EUR/MWh)

numeric Jednotka: EUR json_path

Nejnižší cena v časovém okně

Čtení
VAR date := NOW();
IF From >= To
	RETURN(NaN);
ELSE
	var prices := PARSEJSON(output, "$..price");
	var periodHour := LENGTH(prices) / 24;	
	#var actualperiod := FLOOR(((date.hour * 60) + date.minute) * periodHour / 60);
	var windowPrices := COPY(prices, From * periodHour, (To - From) * periodHour);
	var byPrice := ORDER(windowPrices);

	RETURN(GETAT(byPrice, 0));
END
Nejlevnější perioda dne Proměnná Pouze ke čtení

1-založené číslo periody nejlevnější hodiny dne (např. 3 = 02:00–03:00)

numeric json_path

Nejlevnější perioda dne

Čtení
var prices := PARSEJSON(output, "$..price");
GETAT(ORDERINDEX(prices), 0) +1
Nejlevnější zbývající perioda Proměnná Pouze ke čtení

1-založené číslo periody nejlevnější hodiny od aktuální hodiny dále

numeric json_path

Nejlevnější zbývající perioda

Čtení
var prices := PARSEJSON(output, "$..price");
VAR date := NOW();
var periodHour := LENGTH(prices) / 24;	
var actualperiod := FLOOR(((date.hour * 60) + date.minute) * periodHour / 60);
var remainingPrices := COPY(prices, actualperiod, LENGTH(prices) - actualperiod);
var byPrice := ORDERINDEX(remainingPrices);

GETAT(byPrice, 0) + actualperiod +1
Počet period Proměnná Pouze ke čtení

Celkový počet hodinových cenových period dostupných v odpovědi API (typicky 24 nebo 72)

numeric json_path

Počet period

Čtení
var prices := PARSEJSON(output, "$..price");
LENGTH(prices);
Počet period v časovém okně Proměnná Pouze ke čtení

Počet hodinových cenových period v rámci uživatelem definovaného časového okna Od–Do

numeric json_path

Počet period v časovém okně

Čtení
VAR date := NOW();
IF From >= To
	RETURN(NaN);
ELSE
	var prices := PARSEJSON(output, "$..price");
	var periodHour := LENGTH(prices) / 24;
	var windowPrices := COPY(prices, From * periodHour, (To - From) * periodHour);

	RETURN(LENGTH(windowPrices));
END
Průměrná cena dne Proměnná Pouze ke čtení

Aritmetický průměr všech dostupných cen period (EUR/MWh)

numeric Jednotka: EUR json_path

Průměrná cena dne

Čtení
var prices := PARSEJSON(output, "$..price");
AVG(prices)
Průměrná cena v časovém okně Proměnná Pouze ke čtení

Aritmetický průměr spotových cen v rámci uživatelem definovaného časového okna Od–Do (EUR/MWh)

numeric Jednotka: EUR json_path

Průměrná cena v časovém okně

Čtení
VAR date := NOW();
IF From >= To
	RETURN(NaN);
ELSE
	var prices := PARSEJSON(output, "$..price");
	var periodHour := LENGTH(prices) / 24;	
	#var actualperiod := FLOOR(((date.hour * 60) + date.minute) * periodHour / 60);
	var windowPrices := COPY(prices, From * periodHour, (To - From) * periodHour);

	RETURN(AVG(windowPrices));
END
Připojení: Packet Parser → HTTP