Pi Zero 2 W + ST7789 패널에 노드 상태(누수/온습도/미세먼지·오프라인·정체)를 상시 표시하는 디스플레이 노드 신설. 배포 전 렌더 검증 원칙에 따라 합성 최악 프레임 11종을 패널 실해상도로 render_preview/ 에 PNG 로 선렌더. - st7789_driver.py · display_dashboard.py · render_preview.py(합성 프레임 생성) - install.sh · vendor.sh · systemd/display-dashboard.service · 배선(WIRING)·연결테스트 - render_preview/01~11: 요약/통합/메트릭/오프라인/stale/legacy-무PM 최악 케이스
50 lines
3.1 KiB
Python
50 lines
3.1 KiB
Python
# =============================================================================
|
|
# config.py — 미니 상태 표시기 (Pi Zero 2 W + ST7789V GMT020-02 2.0" 240x320)
|
|
# 비밀값(STATUS_URL/STATUS_KEY)은 config_local.py 에서 로드한다(커밋 금지).
|
|
# cp config_local.example.py config_local.py 후 실값 입력.
|
|
# =============================================================================
|
|
|
|
# ─────────────────────────────────────────────
|
|
# 폴링/화면 주기
|
|
# ─────────────────────────────────────────────
|
|
POLL_INTERVAL = 30 # 서버 상태 폴링 주기(초) — 대시보드 자동 새로고침과 동일
|
|
PAGE_INTERVAL = 8 # 페이지 자동 순환 주기(초): 요약 ↔ 센서별
|
|
FETCH_TIMEOUT = 10 # HTTP 타임아웃(초)
|
|
STALE_AFTER = 120 # 마지막 성공 수신 후 이 시간(초) 지나면 STALE 표시
|
|
|
|
# ─────────────────────────────────────────────
|
|
# ST7789V SPI 배선 (BCM 번호) — README.md 배선표와 일치
|
|
# GMT020-02(7핀): GND / VCC / SCL=SCLK / SDA=MOSI / RES / DC / CS (BLK 없음)
|
|
# ─────────────────────────────────────────────
|
|
SPI_BUS = 0 # SPI0
|
|
SPI_DEVICE = 0 # CE0 (GPIO8)
|
|
SPI_SPEED_HZ = 40_000_000
|
|
PIN_DC = 25 # Data/Command
|
|
PIN_RST = 24 # Reset — 물리 18번(SDA 옆). 7핀을 물리 17~24 블록에 집약
|
|
PIN_BL = None # 7핀 모듈은 백라이트 핀 없음(내부 상시 점등). 8핀이면 BCM 번호(예: 18)
|
|
|
|
WIDTH = 240
|
|
HEIGHT = 320
|
|
ROTATION = 0 # 0/90/180/270 — 설치 방향에 맞춰 조정
|
|
INVERT = True # GMT020-02(IPS) 는 색반전 ON 이 정색
|
|
|
|
# 하드웨어 없이 개발/검증: True 면 SPI 대신 /tmp/display_preview.png 로 렌더 저장.
|
|
# spidev/RPi.GPIO 미설치 환경에서는 자동으로 시뮬레이션 폴백.
|
|
FORCE_SIMULATION = False
|
|
|
|
# 한글 라벨이 필요하면 한글 TTF 경로 지정(기본은 DejaVu — 영문/숫자만).
|
|
FONT_PATH = "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf"
|
|
FONT_PATH_LIGHT = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"
|
|
|
|
LOG_FILE = "/var/log/display_dashboard.log"
|
|
|
|
# ─────────────────────────────────────────────
|
|
# 비밀값 로드 (fail closed — config_local.py 없으면 즉시 중단)
|
|
# ─────────────────────────────────────────────
|
|
try:
|
|
from config_local import * # noqa: F401,F403 — STATUS_URL/STATUS_KEY/DEVICE_NAME
|
|
except ImportError as e:
|
|
raise RuntimeError(
|
|
"config_local.py not found. Run `cp config_local.example.py config_local.py`, "
|
|
"then fill in STATUS_URL / STATUS_KEY."
|
|
) from e
|