-- ============================================================================= -- schema_sht30.sql - SHT30 온습도 모니터링 시스템 신규 설치용 통합 스키마 -- -- 신규 설치: 이 파일 하나만 실행합니다. -- SOURCE /path/to/sql/schema_sht30.sql; -- -- 기존(누수 v2605) 설치를 SHT30 전용으로 전환할 때는 이 파일이 아니라 -- sql/migration_drop_leak.sql 을 사용합니다(데이터 보존 + 누수 잔재 정리). -- -- 누수(leak) 관련 요소는 포함하지 않습니다: -- - 테이블: leak_photo, leak_incident -- - 컬럼: sensor_log.is_leak, sensor_status.is_leak, leak_periodic_count -- - 이벤트: event_type 의 leak_alert / leak_recovery -- 온습도 임계 경보(고온/저온/고습/저습) 판정과 SMS 발송은 서버 PHP(config.php -- 의 METRIC_* 상수 + api/sensor_data.php)에서 수행하며, 발송 이력은 sms_log 에 -- 남습니다. 별도의 경보 상태 테이블은 두지 않습니다(sms_log 기준 쿨다운/복구 판정). -- ============================================================================= SET NAMES utf8mb4; SET time_zone = '+09:00'; CREATE TABLE IF NOT EXISTS `sensor_log` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `device_id` VARCHAR(64) NOT NULL COMMENT 'STM32 기기 ID', `device_location` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '설치 위치', `sensor_id` TINYINT UNSIGNED NOT NULL COMMENT '센서 번호', `sensor_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '센서 이름', `event_type` ENUM('startup','periodic') NOT NULL DEFAULT 'periodic', `sensor_time` DATETIME NOT NULL COMMENT '센서 측정 시각 (기기 기준)', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'DB 저장 시각', PRIMARY KEY (`id`), INDEX `idx_sensor_time` (`sensor_time`), INDEX `idx_device_sensor` (`device_id`, `sensor_id`), INDEX `idx_event_type` (`event_type`, `created_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='센서 이벤트 전체 로그'; CREATE TABLE IF NOT EXISTS `sensor_status` ( `sensor_id` TINYINT UNSIGNED NOT NULL, `device_id` VARCHAR(64) NOT NULL, `sensor_name` VARCHAR(100) NOT NULL DEFAULT '', `device_location` VARCHAR(100) NOT NULL DEFAULT '', `last_event_type` VARCHAR(20) NOT NULL DEFAULT '', `last_seen` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `offline_alerted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '오프라인 알림 발송 여부 (1=발송됨, 0=미발송)', PRIMARY KEY (`sensor_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='센서별 최신 상태 (업서트)'; CREATE TABLE IF NOT EXISTS `sensor_metric` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `device_id` VARCHAR(64) NOT NULL DEFAULT '', `device_location` VARCHAR(100) NOT NULL DEFAULT '', `sensor_id` TINYINT UNSIGNED NOT NULL, `sensor_name` VARCHAR(100) NOT NULL DEFAULT '', `metric_type` VARCHAR(30) NOT NULL DEFAULT 'sht30', `temperature_c` DECIMAL(6,2) NULL, `humidity_percent` DECIMAL(5,2) NULL, `metric_status` VARCHAR(30) NOT NULL DEFAULT 'normal' COMMENT '서버 임계 판정 결과: normal/high_temp/low_temp/high_humidity/low_humidity', `measured_at` DATETIME NOT NULL, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), INDEX `idx_sensor_measured` (`sensor_id`, `measured_at`), INDEX `idx_device_sensor` (`device_id`, `sensor_id`), INDEX `idx_metric_type` (`metric_type`, `created_at`), INDEX `idx_status_measured` (`metric_status`, `measured_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='SHT30 온습도 측정 이력 (온도/습도/임계 상태)'; CREATE TABLE IF NOT EXISTS `sms_log` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `sensor_id` TINYINT UNSIGNED NOT NULL, `sensor_name` VARCHAR(100) NOT NULL DEFAULT '', `device_id` VARCHAR(64) NOT NULL DEFAULT '', `message` TEXT NOT NULL, `receivers` VARCHAR(500) NOT NULL COMMENT '쉼표 구분 수신자 번호', `status` ENUM('success','fail') NOT NULL, `result_code` VARCHAR(20) NOT NULL DEFAULT '', `result_message` VARCHAR(255) NOT NULL DEFAULT '', `sent_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), INDEX `idx_sent_at` (`sent_at`), INDEX `idx_sensor_sent` (`sensor_id`, `sent_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='SMS 발송 이력 (온습도 임계 경보/복구, 장비 오프라인/복구)';