From 93193fd5dca4a3be1a67c92902d29261b2230fd3 Mon Sep 17 00:00:00 2001 From: Dusan Vojacek Date: Wed, 29 Apr 2026 13:48:13 +0200 Subject: [PATCH] fix OTE fformat --- db/routines/R__031_fn_ote_import.sql | 34 +++++++++++++++++++++++----- docs/04-modules/market-prices.md | 2 ++ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/db/routines/R__031_fn_ote_import.sql b/db/routines/R__031_fn_ote_import.sql index 009a4b6..b08bf51 100644 --- a/db/routines/R__031_fn_ote_import.sql +++ b/db/routines/R__031_fn_ote_import.sql @@ -49,14 +49,36 @@ BEGIN -- starší / jiná odpověď = jen 24 hodinových bodů s tooltip "Cena". SELECT t.dl INTO v_dl FROM jsonb_array_elements(in_payload #> '{data,dataLine}') AS t(dl) - WHERE dl ->> 'tooltip' = 'flash_chart_01_y_15m_price_tooltip' + WHERE ( + dl ->> 'tooltip' in ( + 'flash_chart_01_y_15m_price_tooltip', -- legacy OTE + '15min cena (EUR/MWh)', -- current OTE (2026-04+) + '15 min cena (EUR/MWh)' + ) + or ( + lower(dl ->> 'tooltip') like '%15min%' + and lower(dl ->> 'tooltip') like '%cena%' + and lower(dl ->> 'tooltip') like '%mwh%' + ) + ) AND jsonb_array_length(dl -> 'point') >= 90 LIMIT 1; IF v_dl IS NULL THEN SELECT t.dl INTO v_dl FROM jsonb_array_elements(in_payload #> '{data,dataLine}') AS t(dl) - WHERE dl ->> 'tooltip' = 'flash_chart_01_y_60m_price_tooltip' + WHERE ( + dl ->> 'tooltip' in ( + 'flash_chart_01_y_60m_price_tooltip', -- legacy OTE + '60min cena (EUR/MWh)', -- current OTE (2026-04+) + '60 min cena (EUR/MWh)' + ) + or ( + lower(dl ->> 'tooltip') like '%60min%' + and lower(dl ->> 'tooltip') like '%cena%' + and lower(dl ->> 'tooltip') like '%mwh%' + ) + ) AND jsonb_array_length(dl -> 'point') >= 90 LIMIT 1; END IF; @@ -64,7 +86,7 @@ BEGIN IF v_dl IS NULL THEN SELECT t.dl INTO v_dl FROM jsonb_array_elements(in_payload #> '{data,dataLine}') AS t(dl) - WHERE dl ->> 'tooltip' = 'Cena' + WHERE dl ->> 'tooltip' in ('Cena', '60min cena (EUR/MWh)', '60 min cena (EUR/MWh)') AND jsonb_array_length(dl -> 'point') >= 90 LIMIT 1; END IF; @@ -72,7 +94,7 @@ BEGIN IF v_dl IS NULL THEN SELECT t.dl INTO v_dl FROM jsonb_array_elements(in_payload #> '{data,dataLine}') AS t(dl) - WHERE dl ->> 'tooltip' = 'Cena' + WHERE dl ->> 'tooltip' in ('Cena', '60min cena (EUR/MWh)', '60 min cena (EUR/MWh)') AND jsonb_array_length(dl -> 'point') BETWEEN 2 AND 28 LIMIT 1; END IF; @@ -87,7 +109,7 @@ BEGIN IF v_dl IS NULL THEN RAISE EXCEPTION - 'OTE price dataLine not found (očekáváno 15min flash_* nebo hodinová Cena); ' + 'OTE price dataLine not found (očekáváno 15min flash_* / 15min cena nebo hodinová Cena); ' 'dostupné tooltips: %', (SELECT jsonb_agg(dl ->> 'tooltip' ORDER BY dl ->> 'tooltip') FROM jsonb_array_elements(in_payload #> '{data,dataLine}') dl); @@ -153,7 +175,7 @@ $$; COMMENT ON FUNCTION ems.fn_ote_parse_15m_price_json(jsonb, numeric) IS 'Parsuje raw JSON z OTE @@chart-data?time_resolution=PT15M. Datum z graph.title (DD.MM.YYYY). Sloty: kotva půlnoci Europe/Prague jako timestamptz + násobky 15 min (bez DST duplicit). -Výběr série: flash_15m ≥90, flash_60m ≥90, Cena ≥90, Cena 2–28 h, flash_15m 2–28 h. +Výběr série: 15min tooltip (flash_* nebo "15min cena…") ≥90, 60min tooltip (flash_* nebo "60min cena…") ≥90, Cena ≥90, Cena 2–28 h, 15min tooltip 2–28 h. EUR/MWh → Kč/kWh. Typicky 96 řádků, 92 při zkráceném dni (letní čas). Testování přímo v DB: SELECT * FROM ems.fn_ote_parse_15m_price_json(pg_read_file(''/tmp/ote.json'')::jsonb, 25.0) LIMIT 5;'; diff --git a/docs/04-modules/market-prices.md b/docs/04-modules/market-prices.md index 7b474d4..a05d561 100644 --- a/docs/04-modules/market-prices.md +++ b/docs/04-modules/market-prices.md @@ -26,6 +26,8 @@ OTE CZ publikuje denní ceny zpravidla **den předem (D-1)** okolo 13:00–14:00 - Přepočet do `buy_raw_price_czk_kwh`: EUR/MWh → `× EUR_CZK / 1000`; CZK/MWh → `/ 1000`; CZK/kWh beze změny. - Časové razítko slotu při importu: závisí na volbě dne; scheduler a globální import používají **Europe/Prague**. Volitelný parametr `site_id` v `import_ote_prices` umožní pro manuální volání bez explicitního data použít `site.timezone` místo Prahy. +**Poznámka k výběru série (tooltipy):** OTE v čase mění názvy `dataLine[].tooltip`. Import v DB (`ems.fn_ote_parse_15m_price_json`) umí jak legacy tooltipy typu `flash_chart_01_y_15m_price_tooltip`, tak i novější „lidské“ názvy jako `15min cena (EUR/MWh)` / `60min cena (EUR/MWh)`. + ### Legacy / alternativa - **OTE pubapi:** `https://www.ote-cr.cz/pubapi/v1/market-data/dam?...` (hodinová data – v projektu už není primární)