# ============================================================================= # config.py - 누수감지 시스템 v2 (Pi 4 Model B) 설정 — 비밀이 아닌 기본값 # # 서버 URL / API_KEY / 기기 식별자 등 운영·비밀값은 config_local.py 에서 로드한다. # config_local.py 는 .gitignore 로 커밋 제외 대상이다. # 설정 방법: cp config_local.example.py config_local.py → 실제 값으로 채움 # ============================================================================= # ───────────────────────────────────────────── # 센서 GPIO 설정 (BCM 번호 기준 — Pi 4 40핀 헤더와 동일) # GPIO17 = 40핀 헤더 물리 11번 핀 # ───────────────────────────────────────────── SENSORS = [ {"id": 1, "gpio": 17, "name": "1번 센서 (서버실)"}, # 추가 센서가 있으면 아래에 추가 (BCM 번호 기준) # {"id": 2, "gpio": 27, "name": "2번 센서 (기계실)"}, # 물리 13번 # {"id": 3, "gpio": 22, "name": "3번 센서 (화장실)"}, # 물리 15번 ] # 센서 활성 레벨 설정 # e-con 5C-08 저항형 센서 + 4.7MΩ 풀다운 사용 시: # 건조: GPIO = LOW(0) → ACTIVE_LOW = False # 누수: GPIO = HIGH(1) ACTIVE_LOW = False # GPIO 내부 풀저항 설정 # 반드시 False (PUD_OFF) 유지! # 내부 풀다운(50kΩ)을 켜면 누수 시에도 HIGH가 되지 않아 감지 실패함. # → 외부 4.7MΩ 풀다운 저항만 사용 USE_INTERNAL_PULL = False # True = PUD_DOWN, False = PUD_OFF # ───────────────────────────────────────────── # 주기 설정 # ───────────────────────────────────────────── REPORT_INTERVAL = 3600 # 정상 상태 주기 보고 간격 (초) = 1시간 LEAK_REPORT_INTERVAL = 10 # 누수 감지 시 재보고 간격 (초) DEBOUNCE_MS = 500 # 바운싱 방지 시간 (ms) — 고임피던스라 넉넉히 설정 # ───────────────────────────────────────────── # 로그 설정 # ───────────────────────────────────────────── LOG_FILE = "/var/log/leak_sensor.log" LOG_MAX_BYTES = 5 * 1024 * 1024 # 5MB LOG_BACKUP_COUNT = 3 # ───────────────────────────────────────────── # 재시도 설정 # ───────────────────────────────────────────── HTTP_TIMEOUT = 10 # HTTP 요청 타임아웃 (초) HTTP_RETRY_COUNT = 3 # 재시도 횟수 HTTP_RETRY_DELAY = 5 # 재시도 대기 (초) # ───────────────────────────────────────────── # 카메라 설정 # Pi 4 = 15핀(1.0mm 피치) 표준 CSI, Zero 2 W = 22핀(0.5mm 피치) CSI → # 리본/카메라 보드 호환 안 됨 (Pi 4용 15핀 리본 또는 15↔22 변환 어댑터 필요). # 촬영은 rpicam-still(Bookworm) / libcamera-still(Bullseye) 사용. # ───────────────────────────────────────────── CAMERA_ENABLED = True # False로 설정하면 촬영/업로드 건너뜀 PHOTO_WIDTH = 640 # 촬영 해상도 (가로) PHOTO_HEIGHT = 480 # 촬영 해상도 (세로) PHOTO_QUALITY = 60 # JPEG 품질 (1-100, 60 ≈ 50-80KB) # ───────────────────────────────────────────── # 운영·비밀값 로드 (fail closed) # config_local.py 가 없으면 placeholder/하드코딩 비밀로 잘못 기동하는 대신 # 명확한 오류로 즉시 중단한다. # ───────────────────────────────────────────── try: from config_local import ( # noqa: F401 (leak_sensor.py 가 config 에서 재수입) API_URL, API_KEY, PHOTO_UPLOAD_URL, DEVICE_ID, DEVICE_LOCATION, ) except ImportError as e: raise RuntimeError( "config_local.py 를 찾을 수 없습니다. " "`cp config_local.example.py config_local.py` 후 실제 서버 URL / API_KEY / " "기기 정보를 채우세요. (비밀값은 절대 커밋하지 마세요.)" ) from e