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 최악 케이스
51 lines
1.7 KiB
Desktop File
51 lines
1.7 KiB
Desktop File
# =============================================================================
|
|
# /etc/systemd/system/display-dashboard.service
|
|
# 미니 상태 표시기 (Pi Zero 2 W + ST7789V) 부팅 자동 실행
|
|
#
|
|
# 설치:
|
|
# sudo cp systemd/display-dashboard.service /etc/systemd/system/
|
|
# sudo systemctl daemon-reload && sudo systemctl enable --now display-dashboard
|
|
# 경로가 /home/pi/display 가 아니면 WorkingDirectory/ExecStart 수정.
|
|
# =============================================================================
|
|
|
|
[Unit]
|
|
Description=Mini Status Display (Pi Zero 2 W, ST7789V)
|
|
After=network-online.target
|
|
Wants=network-online.target
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=pi
|
|
Group=pi
|
|
# /dev/spidev0.0 + GPIO 문자장치 접근
|
|
SupplementaryGroups=spi gpio
|
|
WorkingDirectory=/home/pi/display
|
|
ExecStart=/home/pi/display/venv/bin/python display_dashboard.py
|
|
Restart=always
|
|
RestartSec=10
|
|
StandardOutput=journal
|
|
StandardError=journal
|
|
SyslogIdentifier=display-dashboard
|
|
Environment=PYTHONUNBUFFERED=1
|
|
PrivateTmp=true
|
|
|
|
# ── 샌드박스 (sht30 유닛과 동일 정책) ──────────────────────────────────────
|
|
NoNewPrivileges=true
|
|
ProtectSystem=strict
|
|
ReadWritePaths=/var/log
|
|
ProtectHome=read-only
|
|
ProtectKernelModules=true
|
|
ProtectKernelTunables=true
|
|
ProtectControlGroups=true
|
|
RestrictSUIDSGID=true
|
|
LockPersonality=true
|
|
RestrictRealtime=true
|
|
# HTTPS 폴링 + 로컬 소켓(DNS/journal). AF_NETLINK 은 getaddrinfo 용.
|
|
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX AF_NETLINK
|
|
# ⚠️ PrivateDevices 금지 — /dev/spidev0.0, /dev/gpiomem 이 가려져 화면 불가.
|
|
|
|
StartLimitBurst=5
|
|
StartLimitInterval=600s
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|