implementace Ekonomiky
All checks were successful
test / smoke-test (push) Successful in 5s
deploy / deploy (push) Successful in 11s

This commit is contained in:
Dusan Vojacek
2026-04-05 20:10:43 +02:00
parent caf3f522e2
commit 5fcc47bce2
13 changed files with 1310 additions and 31 deletions

View File

@@ -0,0 +1,75 @@
-- =============================================================
-- R__vw_site_effective_price_economics.sql
-- EMS Platform ekonomické views (závisí na vw_site_effective_price)
-- Musí běžet až PO R__vw_site_effective_price.sql (abecední pořadí Flyway).
-- Repeatable migration
-- =============================================================
CREATE OR REPLACE VIEW ems.vw_economics_interval AS
SELECT
ai.site_id,
ai.interval_start,
ROUND(GREATEST(ai.actual_grid_power_w, 0)::NUMERIC / 4000, 4) AS import_kwh,
ROUND(ABS(LEAST(ai.actual_grid_power_w, 0))::NUMERIC / 4000, 4) AS export_kwh,
CASE WHEN ai.actual_grid_power_w >= 0
THEN ROUND((ai.actual_grid_power_w::NUMERIC / 4000)
* COALESCE(ep.effective_buy_price_czk_kwh, 0), 4)
ELSE ROUND((ai.actual_grid_power_w::NUMERIC / 4000)
* COALESCE(ep.effective_sell_price_czk_kwh, 0), 4)
END AS dynamic_cost_czk,
ai.actual_cost_czk AS stored_cost_czk,
ai.green_bonus_czk,
pi.expected_cost_czk AS planned_cost_czk,
pi.grid_setpoint_w AS planned_grid_w,
ai.actual_grid_power_w,
ep.effective_buy_price_czk_kwh,
ep.effective_sell_price_czk_kwh,
pi.effective_buy_price AS planned_buy_price,
pi.effective_sell_price AS planned_sell_price,
ai.actual_pv_power_w,
ai.actual_load_power_w,
ai.actual_ev_power_w,
ai.actual_heat_pump_power_w,
ai.actual_battery_power_w,
ai.actual_battery_soc_pct
FROM ems.audit_interval ai
LEFT JOIN ems.vw_site_effective_price ep
ON ep.site_id = ai.site_id AND ep.interval_start = ai.interval_start
LEFT JOIN ems.planning_interval pi
ON pi.run_id = ai.planning_run_id AND pi.interval_start = ai.interval_start;
COMMENT ON VIEW ems.vw_economics_interval IS
'Dynamické ekonomické vyhodnocení per 15min slot (závisí na vw_site_effective_price).';
CREATE OR REPLACE VIEW ems.vw_economics_daily AS
SELECT
site_id,
date_trunc('day', interval_start AT TIME ZONE 'Europe/Prague')::date AS day_local,
COUNT(*)::int AS interval_count,
ROUND(SUM(import_kwh), 3) AS import_kwh,
ROUND(SUM(export_kwh), 3) AS export_kwh,
ROUND(SUM(GREATEST(actual_pv_power_w, 0)::NUMERIC / 4000), 3) AS pv_kwh,
ROUND(SUM(GREATEST(actual_load_power_w, 0)::NUMERIC / 4000), 3) AS load_kwh,
ROUND(SUM(GREATEST(actual_ev_power_w, 0)::NUMERIC / 4000), 3) AS ev_kwh,
ROUND(SUM(GREATEST(actual_heat_pump_power_w, 0)::NUMERIC / 4000), 3) AS hp_kwh,
ROUND(SUM(GREATEST(actual_pv_power_w, 0)::NUMERIC / 4000)
- SUM(export_kwh), 3) AS self_consumption_kwh,
ROUND(SUM(CASE WHEN dynamic_cost_czk > 0
THEN dynamic_cost_czk ELSE 0 END), 2) AS import_cost_czk,
ROUND(SUM(CASE WHEN dynamic_cost_czk < 0
THEN ABS(dynamic_cost_czk) ELSE 0 END), 2) AS export_revenue_czk,
ROUND(SUM(dynamic_cost_czk), 2) AS net_cost_czk,
ROUND(COALESCE(SUM(green_bonus_czk), 0), 2) AS green_bonus_czk,
ROUND(-SUM(dynamic_cost_czk)
+ COALESCE(SUM(green_bonus_czk), 0), 2) AS total_balance_czk,
ROUND(SUM(planned_cost_czk), 2) AS planned_net_cost_czk,
ROUND(-COALESCE(SUM(planned_cost_czk), 0)
+ COALESCE(SUM(green_bonus_czk), 0), 2) AS planned_balance_czk,
ROUND(SUM(dynamic_cost_czk)
- COALESCE(SUM(planned_cost_czk), 0), 2) AS deviation_cost_czk
FROM ems.vw_economics_interval
GROUP BY site_id,
date_trunc('day', interval_start AT TIME ZONE 'Europe/Prague')::date;
COMMENT ON VIEW ems.vw_economics_daily IS
'Denní souhrn ekonomiky (závisí na vw_economics_interval).';