누수 감지↔복구 플래핑 SMS 폭탄 방지, 온습도 측정 주기 1시간화(부수 오탐
차단), 센서별 SMS 수신자 그룹 지정 3종을 함께 반영한다.
1) 누수 디바운스 (서버 전용, 펌웨어 무변경)
- leak_sensor_status 에 leak_confirmed / leak_pending_since 컬럼 추가.
- leak_debounce_decide(): 단일 대칭 타이머 순수 함수. raw 상태가 확인창
동안 지속돼야 확정하고 확정 엣지에서만 SMS 1회. dry 블립<복구창이면
복구 미확정 → 확정 유지 → 재감지·복구 SMS 둘 다 차단(폭탄 원천 봉쇄).
- apply_leak_debounce()/sweep_pending_leak_transitions(): 센서 네임드 락으로
직렬화, cron sweep 으로 보고 끊겨도 확정 해소. 사고(leak_incident)
open/close 도 확정 엣지로 이동(월간보고 사고건수 정합). raw 이벤트는
leak_sensor_log 에 그대로 보존(플래핑 진단).
- 컬럼 없는 구배포는 레거시 즉시 발송으로 graceful degrade.
- 확인창 기본: 감지 60s / 복구 180s (config.local.php 조정).
2) 온습도 1시간 주기 + 센서별 히트비트 타임아웃
- raspberry_pi4_sht30/config.py REPORT_INTERVAL 300→3600.
- heartbeat_timeout_for(): 명시 오버라이드 > 온습도 기본(7500s) > 전역(1200s).
cron_heartbeat / dashboard 오프라인 판정을 센서별로. 매시간 오탐 제거,
누수 오프라인은 20분 유지.
- STUCK_DETECT_SAMPLES 6→3(1시간 주기 ≈3시간), 관련 주석 정정.
3) 센서별 수신자 그룹
- SENSOR_RECIPIENTS 맵 + recipients_for_sensor() 전역 폴백.
- sms_dispatch_to_recipients 가 센서별로 수신자 해소(에스컬레이션 TIER2
명시 전달은 유지, 헬스/잔액은 전역).
대시보드: 누수 카드 '확인중(디바운스)' 배지, 시스템 탭에 확인창·센서별
타임아웃·수신자 그룹 표시.
마이그레이션: sql/migration_leak_debounce.sql (컬럼 2개), schema_sht30.sql 갱신.
테스트: leak_debounce(12) / recipients_group / heartbeat_timeout 순수 단위 추가.
설계: docs/superpowers/specs/2026-07-13-leak-debounce-sensor-config-design.md
26 lines
1.7 KiB
SQL
26 lines
1.7 KiB
SQL
-- migration_leak_debounce.sql
|
|
-- 누수 감지/복구 디바운스: 기존 배포의 leak_sensor_status 에 확정 상태 컬럼 2개 추가.
|
|
-- leak_confirmed : 디바운스로 "확정"된 누수 상태(SMS/사고추적 기준). is_leak 은 raw 최신.
|
|
-- leak_pending_since : raw 가 확정과 어긋나기 시작한 시각(NULL=안정). 확인창 경과로 확정.
|
|
--
|
|
-- 신규 설치는 schema_sht30.sql 에 이미 포함되어 있으므로 실행 불필요. 이 파일은 "기존
|
|
-- 운영 DB" 업그레이드 전용이다.
|
|
-- 실행: SOURCE /path/to/sql/migration_leak_debounce.sql;
|
|
--
|
|
-- 멱등성: MySQL 8 은 ADD COLUMN IF NOT EXISTS 를 지원하지 않으므로, 이미 적용된 DB 에서
|
|
-- 재실행하면 "Duplicate column name" 오류가 난다(무해 — 이미 컬럼이 있다는 뜻이니 무시).
|
|
-- MariaDB 라면 아래 문에 `IF NOT EXISTS` 를 넣어 안전하게 재실행할 수 있다.
|
|
--
|
|
-- 참고: 이 컬럼이 없어도 서버는 레거시(즉시 발송) 경로로 계속 동작한다(graceful degrade).
|
|
-- 디바운스를 켜려면 이 마이그레이션을 적용하면 된다.
|
|
|
|
SET NAMES utf8mb4;
|
|
|
|
ALTER TABLE `leak_sensor_status`
|
|
ADD COLUMN `leak_confirmed` TINYINT(1) NOT NULL DEFAULT 0
|
|
COMMENT '디바운스 확정 누수 상태(SMS/사고추적 기준; is_leak 은 raw 최신)',
|
|
ADD COLUMN `leak_pending_since` DATETIME NULL DEFAULT NULL
|
|
COMMENT '미확정 전이 시작 시각(NULL=안정, raw==confirmed)';
|
|
|
|
-- 적용 후: 이미 누수(is_leak=1) 중인 센서는 leak_confirmed=0 으로 시작하므로, 다음 보고에서
|
|
-- 감지 확인창(LEAK_ALERT_CONFIRM_SEC) 경과 후 [누수감지] 를 1회 재확정한다(사실상 재확인).
|