Merge pull request #335 from SyncrowIOT/DATA-parametrized-energy-consumption

DATA-parametrized energy consumption
This commit is contained in:
faljawhary
2025-04-17 10:05:47 +03:00
committed by GitHub

View File

@ -1,71 +1,87 @@
WITH total_energy AS ( WITH params AS (
SELECT SELECT
device_id, NULL::uuid AS device_id, -- filter: specific device (or NULL for all)
event_time::date AS date, NULL::date AS input_date, -- filter: start date (or NULL for open range) -- filter: end date (or NULL for open range)
EXTRACT(HOUR FROM event_time) AS hour, NULL::int AS hour, -- filter: hour of day (or NULL for all hours)
MIN(value)::integer AS min_value, NULL::int AS min_kw -- filter: min kW consumed (or NULL for no filter)
MAX(value)::integer AS max_value ),
FROM "device-status-log"
WHERE code = 'EnergyConsumed' total_energy AS (
GROUP BY device_id, date, hour SELECT
log.device_id,
log.event_time::date AS date,
EXTRACT(HOUR FROM log.event_time) AS hour,
MIN(log.value)::integer AS min_value,
MAX(log.value)::integer AS max_value
FROM "device-status-log" log, params
WHERE log.code = 'EnergyConsumed'
AND (params.device_id IS NULL OR log.device_id = params.device_id)
AND (params.input_date IS NULL OR log.event_time::date >= params.input_date)
AND (params.input_date IS NULL OR log.event_time::date <= params.input_date)
AND (params.hour IS NULL OR EXTRACT(HOUR FROM log.event_time) = params.hour)
GROUP BY log.device_id, log.event_time::date, EXTRACT(HOUR FROM log.event_time)
), ),
energy_phase_A AS ( energy_phase_A AS (
SELECT SELECT
device_id, log.device_id,
event_time::date AS date, log.event_time::date AS date,
EXTRACT(HOUR FROM event_time) AS hour, EXTRACT(HOUR FROM log.event_time) AS hour,
MIN(value)::integer AS min_value, MIN(log.value)::integer AS min_value,
MAX(value)::integer AS max_value MAX(log.value)::integer AS max_value
FROM "device-status-log" FROM "device-status-log" log, params
WHERE code = 'EnergyConsumedA' WHERE log.code = 'EnergyConsumedA'
GROUP BY device_id, date, hour AND (params.device_id IS NULL OR log.device_id = params.device_id)
AND (params.input_date IS NULL OR log.event_time::date >= params.input_date)
AND (params.input_date IS NULL OR log.event_time::date <= params.input_date)
AND (params.hour IS NULL OR EXTRACT(HOUR FROM log.event_time) = params.hour)
GROUP BY log.device_id, log.event_time::date, EXTRACT(HOUR FROM log.event_time)
), ),
energy_phase_B AS ( energy_phase_B AS (
SELECT SELECT
device_id, log.device_id,
event_time::date AS date, log.event_time::date AS date,
EXTRACT(HOUR FROM event_time) AS hour, EXTRACT(HOUR FROM log.event_time) AS hour,
MIN(value)::integer AS min_value, MIN(log.value)::integer AS min_value,
MAX(value)::integer AS max_value MAX(log.value)::integer AS max_value
FROM "device-status-log" FROM "device-status-log" log, params
WHERE code = 'EnergyConsumedB' WHERE log.code = 'EnergyConsumedB'
GROUP BY device_id, date, hour AND (params.device_id IS NULL OR log.device_id = params.device_id)
AND (params.input_date IS NULL OR log.event_time::date >= params.input_date)
AND (params.input_date IS NULL OR log.event_time::date <= params.input_date)
AND (params.hour IS NULL OR EXTRACT(HOUR FROM log.event_time) = params.hour)
GROUP BY log.device_id, log.event_time::date, EXTRACT(HOUR FROM log.event_time)
), ),
energy_phase_C AS ( energy_phase_C AS (
SELECT SELECT
device_id, log.device_id,
event_time::date AS date, log.event_time::date AS date,
EXTRACT(HOUR FROM event_time) AS hour, EXTRACT(HOUR FROM log.event_time) AS hour,
MIN(value)::integer AS min_value, MIN(log.value)::integer AS min_value,
MAX(value)::integer AS max_value MAX(log.value)::integer AS max_value
FROM "device-status-log" FROM "device-status-log" log, params
WHERE code = 'EnergyConsumedC' WHERE log.code = 'EnergyConsumedC'
GROUP BY device_id, date, hour AND (params.device_id IS NULL OR log.device_id = params.device_id)
AND (params.input_date IS NULL OR log.event_time::date >= params.input_date)
AND (params.input_date IS NULL OR log.event_time::date <= params.input_date)
AND (params.hour IS NULL OR EXTRACT(HOUR FROM log.event_time) = params.hour)
GROUP BY log.device_id, log.event_time::date, EXTRACT(HOUR FROM log.event_time)
) )
SELECT SELECT
total_energy.device_id, t.device_id,
total_energy.date, t.date,
total_energy.hour, t.hour,
(total_energy.max_value - total_energy.min_value) AS energy_consumed_kW, (t.max_value - t.min_value) AS energy_consumed_kW,
(energy_phase_A.max_value - energy_phase_A.min_value) AS energy_consumed_A, (a.max_value - a.min_value) AS energy_consumed_A,
(energy_phase_B.max_value - energy_phase_B.min_value) AS energy_consumed_B, (b.max_value - b.min_value) AS energy_consumed_B,
(energy_phase_C.max_value - energy_phase_C.min_value) AS energy_consumed_C (c.max_value - c.min_value) AS energy_consumed_C
FROM total_energy FROM total_energy t
JOIN energy_phase_A JOIN energy_phase_A a ON t.device_id = a.device_id AND t.date = a.date AND t.hour = a.hour
ON total_energy.device_id = energy_phase_A.device_id JOIN energy_phase_B b ON t.device_id = b.device_id AND t.date = b.date AND t.hour = b.hour
AND total_energy.date = energy_phase_A.date JOIN energy_phase_C c ON t.device_id = c.device_id AND t.date = c.date AND t.hour = c.hour
AND total_energy.hour = energy_phase_A.hour JOIN params p ON TRUE
JOIN energy_phase_B WHERE (p.min_kw IS NULL OR (t.max_value - t.min_value) >= p.min_kw)
ON total_energy.device_id = energy_phase_B.device_id ORDER BY t.device_id, t.date, t.hour;
AND total_energy.date = energy_phase_B.date
AND total_energy.hour = energy_phase_B.hour
JOIN energy_phase_C
ON total_energy.device_id = energy_phase_C.device_id
AND total_energy.date = energy_phase_C.date
AND total_energy.hour = energy_phase_C.hour
ORDER BY total_energy.device_id, total_energy.date, total_energy.hour;