latest one

This commit is contained in:
Dona Maria Absi
2025-05-02 14:52:13 +03:00
parent 22436af903
commit 76806f8df4
2 changed files with 107 additions and 76 deletions

View File

@ -1,80 +1,16 @@
WITH params AS (
SELECT
$1::uuid AS device_id,
$2::text::date AS event_date
),
device_logs AS (
SELECT
device.uuid AS device_id,
device.created_at,
device.device_tuya_uuid,
device.space_device_uuid AS space_id,
"device-status-log".event_id,
"device-status-log".event_time::timestamp,
"device-status-log".code,
"device-status-log".value,
"device-status-log".log,
LAG("device-status-log".event_time::timestamp)
OVER (PARTITION BY device.uuid
ORDER BY "device-status-log".event_time) AS prev_timestamp,
LAG("device-status-log".value)
OVER (PARTITION BY device.uuid
ORDER BY "device-status-log".event_time) AS prev_value
FROM device
LEFT JOIN "device-status-log"
ON device.uuid = "device-status-log".device_id
LEFT JOIN product
ON product.uuid = device.product_device_uuid
JOIN params ON params.device_id = device.uuid::text
WHERE product.cat_name = 'hps'
AND "device-status-log".code = 'presence_state'
AND "device-status-log".event_time::date = params.event_date
),
presence_detection AS (
SELECT *,
CASE
WHEN value = 'motion' AND prev_value = 'none' THEN 1 ELSE 0
END AS motion_detected,
CASE
WHEN value = 'presence' AND prev_value = 'none' THEN 1 ELSE 0
END AS presence_detected
FROM device_logs
),
presence_detection_summary AS (
SELECT
pd.device_id,
d.subspace_id,
pd.space_id,
pd.event_time::date AS event_date,
EXTRACT(HOUR FROM date_trunc('hour', pd.event_time)) AS event_hour,
SUM(motion_detected) AS count_motion_detected,
SUM(presence_detected) AS count_presence_detected,
SUM(motion_detected + presence_detected) AS count_total_presence_detected
FROM presence_detection pd
LEFT JOIN device d ON d.uuid = pd.device_id
GROUP BY 1, 2, 3, 4, 5
),
all_dates_and_hours AS (
SELECT device_id, subspace_id, space_id, event_date, event_hour
FROM (
SELECT DISTINCT device_id, subspace_id, space_id, event_date
FROM presence_detection_summary
) d,
generate_series(0, 23) AS event_hour
--TO_DATE(NULLIF($2, ''), 'YYYY-MM-DD') AS event_date,
--string_to_array(NULLIF($4, ''), ',') AS device_ids,
NULL::date AS event_date,
ARRAY['8d2ae87f-4068-4f45-8eb7-9b5f5bf7c6c2'] AS device_ids
)
SELECT
adah.*,
COALESCE(pds.count_motion_detected, 0) AS count_motion_detected,
COALESCE(pds.count_presence_detected, 0) AS count_presence_detected,
COALESCE(pds.count_total_presence_detected, 0) AS count_total_presence_detected
FROM all_dates_and_hours adah
LEFT JOIN presence_detection_summary pds
ON pds.device_id = adah.device_id
AND pds.event_date = adah.event_date
AND pds.event_hour = adah.event_hour
ORDER BY 1, 4, 5;
SELECT A.*
FROM public."presence-sensor-daily-detection" AS A
JOIN params P ON TRUE
WHERE A.device_uuid::text = ANY(P.device_ids)
AND (
P.event_date IS NULL OR A.event_date = P.event_date OR A.event_date IS NULL
)
order by A.device_uuid, A.event_date ;

View File

@ -0,0 +1,95 @@
-- This model shows the number of times a presence was detected per hour, per day.
INSERT INTO public."presence-sensor-daily-detection" (
device_uuid,
event_date,
count_motion_detected,
count_presence_detected,
count_total_presence_detected
)
WITH device_logs AS (
SELECT
device.uuid AS device_id,
device.created_at,
device.device_tuya_uuid,
device.space_device_uuid AS space_id,
"device-status-log".event_id,
"device-status-log".event_time::timestamp,
"device-status-log".code,
"device-status-log".value,
"device-status-log".log,
LAG("device-status-log".event_time::timestamp)
OVER (PARTITION BY device.uuid
ORDER BY "device-status-log".event_time) AS prev_timestamp,
LAG("device-status-log".value)
OVER (PARTITION BY device.uuid
ORDER BY "device-status-log".event_time) AS prev_value
FROM device
LEFT JOIN "device-status-log"
ON device.uuid = "device-status-log".device_id
LEFT JOIN product
ON product.uuid = device.product_device_uuid
WHERE product.cat_name = 'hps'
AND "device-status-log".code = 'presence_state'
),
presence_detection AS (
SELECT *,
CASE
WHEN value = 'motion' AND prev_value = 'none' THEN 1 ELSE 0
END AS motion_detected,
CASE
WHEN value = 'presence' AND prev_value = 'none' THEN 1 ELSE 0
END AS presence_detected
FROM device_logs
),
presence_detection_summary AS (
SELECT
pd.device_id,
d.subspace_id,
pd.space_id,
pd.event_time::date AS event_date,
EXTRACT(HOUR FROM date_trunc('hour', pd.event_time)) AS event_hour,
SUM(motion_detected) AS count_motion_detected,
SUM(presence_detected) AS count_presence_detected,
SUM(motion_detected + presence_detected) AS count_total_presence_detected
FROM presence_detection pd
LEFT JOIN device d ON d.uuid = pd.device_id
GROUP BY 1, 2, 3, 4, 5
),
all_dates_and_hours AS (
SELECT device_id, subspace_id, space_id, event_date, event_hour
FROM (
SELECT DISTINCT device_id, subspace_id, space_id, event_date
FROM presence_detection_summary
) d,
generate_series(0, 23) AS event_hour
),
table_final AS (
SELECT
adah.*,
COALESCE(pds.count_motion_detected, 0) AS count_motion_detected,
COALESCE(pds.count_presence_detected, 0) AS count_presence_detected,
COALESCE(pds.count_total_presence_detected, 0) AS count_total_presence_detected
FROM all_dates_and_hours adah
LEFT JOIN presence_detection_summary pds
ON pds.device_id = adah.device_id
AND pds.event_date = adah.event_date
AND pds.event_hour = adah.event_hour
)
SELECT
device_id,
event_date,
SUM(count_motion_detected),
SUM(count_presence_detected),
SUM(count_total_presence_detected)
FROM table_final
GROUP BY 1, 2
ON CONFLICT (device_uuid, event_date) DO UPDATE
SET
count_motion_detected = EXCLUDED.count_motion_detected,
count_presence_detected = EXCLUDED.count_presence_detected,
count_total_presence_detected = EXCLUDED.count_total_presence_detected;