dalsi uprava vypoctu delty (ignorujeme orezane vyroby)
This commit is contained in:
12
db/migration/V058__telemetry_inverter_derating_flags.sql
Normal file
12
db/migration/V058__telemetry_inverter_derating_flags.sql
Normal file
@@ -0,0 +1,12 @@
|
||||
-- Volitelné flagy pro vyloučení „škrcených“ slotů z učení PV delty (fáze 2 plánu kalibrace).
|
||||
-- Plní collector podle režimu / registrů (145/179 apod.); dokud NULL, R__022 je ignoruje.
|
||||
|
||||
ALTER TABLE ems.telemetry_inverter
|
||||
ADD COLUMN IF NOT EXISTS is_export_limited boolean NULL,
|
||||
ADD COLUMN IF NOT EXISTS pv_derating_flags int NULL;
|
||||
|
||||
COMMENT ON COLUMN ems.telemetry_inverter.is_export_limited IS
|
||||
'TRUE = interval indikuje omezení exportu / odpojení GEN (např. cut-off mikroinvertorů); fn_fill_forecast_accuracy může vyloučit slot z učení.';
|
||||
|
||||
COMMENT ON COLUMN ems.telemetry_inverter.pv_derating_flags IS
|
||||
'Bitová maska nebo enum z režimu střídače (derating); <> 0 může vést k vyloučení slotu z učení delty.';
|
||||
@@ -27,16 +27,16 @@ BEGIN
|
||||
/ 3600.0, 2
|
||||
) AS lead_time_hours,
|
||||
CASE
|
||||
WHEN v.is_curtailed_learning_slot THEN NULL
|
||||
WHEN v.exclude_actual_for_learning THEN NULL
|
||||
ELSE slot.avg_actual_w::INT
|
||||
END AS actual_power_w,
|
||||
now() AS actual_filled_at,
|
||||
CASE
|
||||
WHEN v.is_curtailed_learning_slot THEN NULL
|
||||
WHEN v.exclude_actual_for_learning THEN NULL
|
||||
ELSE fpi.power_w - COALESCE(slot.avg_actual_w::INT, 0)
|
||||
END AS error_w,
|
||||
CASE
|
||||
WHEN v.is_curtailed_learning_slot THEN NULL
|
||||
WHEN v.exclude_actual_for_learning THEN NULL
|
||||
WHEN slot.avg_actual_w IS NOT NULL
|
||||
AND slot.avg_actual_w > 0
|
||||
THEN ROUND(
|
||||
@@ -85,21 +85,34 @@ BEGIN
|
||||
AND l.new_state IS FALSE
|
||||
)
|
||||
)
|
||||
) AS is_curtailed_learning_slot
|
||||
) AS is_curtailed_learning_slot,
|
||||
EXISTS (
|
||||
SELECT 1
|
||||
FROM ems.telemetry_inverter ti_d
|
||||
WHERE ti_d.site_id = fpr.site_id
|
||||
AND ti_d.measured_at >= fpi.interval_start
|
||||
AND ti_d.measured_at < fpi.interval_start + INTERVAL '15 minutes'
|
||||
AND (
|
||||
coalesce(ti_d.is_export_limited, false) IS TRUE
|
||||
OR (ti_d.pv_derating_flags IS NOT NULL AND ti_d.pv_derating_flags <> 0)
|
||||
)
|
||||
) AS is_telemetry_derated_slot
|
||||
) flags ON true
|
||||
LEFT JOIN LATERAL (
|
||||
SELECT
|
||||
CASE
|
||||
WHEN flags.before_learn_cutoff THEN false
|
||||
WHEN flags.is_curtailed_learning_slot THEN false
|
||||
WHEN flags.is_telemetry_derated_slot THEN false
|
||||
ELSE true
|
||||
END AS learning_eligible,
|
||||
CASE
|
||||
WHEN flags.before_learn_cutoff THEN 'before_delta_learn_min'
|
||||
WHEN flags.is_telemetry_derated_slot THEN 'telemetry_derating'
|
||||
WHEN flags.is_curtailed_learning_slot THEN 'curtailment_or_export_cutoff'
|
||||
ELSE NULL
|
||||
END AS learning_exclude_reason,
|
||||
flags.is_curtailed_learning_slot
|
||||
(flags.is_curtailed_learning_slot OR flags.is_telemetry_derated_slot) AS exclude_actual_for_learning
|
||||
) v ON true
|
||||
LEFT JOIN LATERAL (
|
||||
SELECT AVG(
|
||||
@@ -133,7 +146,8 @@ $$;
|
||||
COMMENT ON FUNCTION ems.fn_fill_forecast_accuracy(INT, INT) IS
|
||||
'Doplní skutečné hodnoty výroby do forecast_accuracy z telemetrie.
|
||||
learning_eligible / learning_exclude_reason: před delta_learn_min_ts (kalibrace site) se nepočítá do učení delty;
|
||||
po pv_curtailment_policy_effective_from sloty s curtailment / gen cutoff / cutoff_switch_log (export off) mají NULL actual a jsou vyloučeny z učení.
|
||||
po pv_curtailment_policy_effective_from sloty s curtailment / gen cutoff / cutoff_switch_log (export off) mají NULL actual a jsou vyloučeny z učení;
|
||||
telemetrie: is_export_limited nebo pv_derating_flags <> 0 v okně slotu → stejné vyloučení (telemetry_derating).
|
||||
Volat každých 15 minut (spolu s audit_filler) pro inkrementální plnění.
|
||||
p_lookback_hours: kolik hodin zpět zpracovat (default 48h pro catch-up).
|
||||
Pro první backfill: SELECT ems.fn_fill_forecast_accuracy(2, 8760) -- 1 rok';
|
||||
|
||||
@@ -234,6 +234,12 @@ as $fn$
|
||||
),
|
||||
'[]'::jsonb
|
||||
),
|
||||
'pv_forecast_calibration',
|
||||
(
|
||||
select to_jsonb(c.*)
|
||||
from ems.site_pv_forecast_calibration c
|
||||
where c.site_id = p_site_id
|
||||
),
|
||||
'operational',
|
||||
jsonb_build_object(
|
||||
'heartbeat_last_seen',
|
||||
|
||||
@@ -27,7 +27,9 @@ SELECT DISTINCT ON (t.inverter_id)
|
||||
t.gen_port_power_w,
|
||||
t.batt_charge_today_wh,
|
||||
t.batt_discharge_today_wh,
|
||||
t.run_state
|
||||
t.run_state,
|
||||
t.is_export_limited,
|
||||
t.pv_derating_flags
|
||||
FROM ems.telemetry_inverter t
|
||||
JOIN ems.asset_inverter inv ON inv.id = t.inverter_id
|
||||
ORDER BY t.inverter_id, t.measured_at DESC;
|
||||
|
||||
Reference in New Issue
Block a user