Initial commit

Made-with: Cursor
This commit is contained in:
Dusan Vojacek
2026-03-20 13:27:37 +01:00
commit 8b4af663d8
77 changed files with 13337 additions and 0 deletions

View File

@@ -0,0 +1,69 @@
-- =============================================================
-- R__vw_audit_summary.sql
-- EMS Platform přehledové views pro audit a dashboard
-- Repeatable migration
-- =============================================================
-- Denní souhrn per lokalita
CREATE OR REPLACE VIEW ems.vw_audit_daily AS
SELECT
site_id,
date_trunc('day', interval_start AT TIME ZONE 'Europe/Prague') AS day_local,
COUNT(*) AS interval_count,
-- Energie (kWh = W × 15min / 60 = W / 4 / 1000)
ROUND(SUM(GREATEST(actual_grid_power_w, 0))::NUMERIC / 4000, 3) AS import_kwh,
ROUND(SUM(ABS(LEAST(actual_grid_power_w, 0)))::NUMERIC / 4000, 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,
-- Náklady
ROUND(SUM(actual_cost_czk), 2) AS actual_cost_czk,
ROUND(SUM(deviation_cost_czk), 2) AS total_deviation_czk,
-- Počet intervalů s velkými odchylkami (>1kW)
COUNT(*) FILTER (WHERE ABS(deviation_grid_w) > 1000) AS high_deviation_count
FROM ems.audit_interval
GROUP BY site_id, date_trunc('day', interval_start AT TIME ZONE 'Europe/Prague');
COMMENT ON VIEW ems.vw_audit_daily IS
'Denní souhrn auditu per lokalita. Energie v kWh, náklady v Kč.
Používat pro dashboard denního přehledu a reporty.';
-- ============================================================
-- Týdenní souhrn
CREATE OR REPLACE VIEW ems.vw_audit_weekly AS
SELECT
site_id,
date_trunc('week', interval_start AT TIME ZONE 'Europe/Prague') AS week_local,
ROUND(SUM(GREATEST(actual_grid_power_w, 0))::NUMERIC / 4000, 1) AS import_kwh,
ROUND(SUM(ABS(LEAST(actual_grid_power_w, 0)))::NUMERIC / 4000, 1) AS export_kwh,
ROUND(SUM(GREATEST(actual_pv_power_w, 0))::NUMERIC / 4000, 1) AS pv_kwh,
ROUND(SUM(actual_cost_czk), 0) AS actual_cost_czk
FROM ems.audit_interval
GROUP BY site_id, date_trunc('week', interval_start AT TIME ZONE 'Europe/Prague');
COMMENT ON VIEW ems.vw_audit_weekly IS
'Týdenní souhrn auditu per lokalita.';
-- ============================================================
-- Aktuální den hourly breakdown pro dashboard graf
CREATE OR REPLACE VIEW ems.vw_audit_today_hourly AS
SELECT
site_id,
date_trunc('hour', interval_start AT TIME ZONE 'Europe/Prague') AS hour_local,
ROUND(AVG(actual_pv_power_w)::NUMERIC / 1000, 2) AS avg_pv_kw,
ROUND(AVG(actual_battery_power_w)::NUMERIC / 1000, 2) AS avg_battery_kw,
ROUND(AVG(actual_grid_power_w)::NUMERIC / 1000, 2) AS avg_grid_kw,
ROUND(AVG(actual_load_power_w)::NUMERIC / 1000, 2) AS avg_load_kw,
ROUND(AVG(actual_battery_soc_pct), 1) AS avg_soc_pct,
ROUND(SUM(actual_cost_czk), 2) AS cost_czk
FROM ems.audit_interval
WHERE interval_start >= date_trunc('day', now() AT TIME ZONE 'Europe/Prague')
AND interval_start < date_trunc('day', now() AT TIME ZONE 'Europe/Prague') + INTERVAL '1 day'
GROUP BY site_id, date_trunc('hour', interval_start AT TIME ZONE 'Europe/Prague')
ORDER BY hour_local;
COMMENT ON VIEW ems.vw_audit_today_hourly IS
'Hodinový přehled dnešního dne pro dashboard graf výkonů a nákladů.';