교사가 앱에 직접 접속해서 위치를 바꾸는 대신, 교무실 출입구의 Stream Deck(15키)에서 이름 버튼 하나로 "수업 중"을 표시하고, 설정 버튼으로 과학실/출장 등 다른 위치도 고를 수 있게 하는 라즈베리파이용 독립 스크립트. 기존 POST /api/teacher-call/location API를 그대로 호출하므로 서버/앱 변경 없이 별도 기기에서 실행하면 된다. 선생님 목록은 /api/teacher-call/teachers에서 1분마다 자동 새로고침해서 새로 가입한 교사도 재시작 없이 반영된다. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
93 lines
3.7 KiB
Markdown
93 lines
3.7 KiB
Markdown
# 교무실 Stream Deck 선생님 위치 표시기
|
|
|
|
교무실 출입구에 놓인 Stream Deck으로 선생님이 본인 이름 버튼만 누르면
|
|
백품타 앱의 "선생님 호출" 위치가 바뀝니다. 이미 배포돼 있는 서버 API
|
|
(`POST /api/teacher-call/location`)를 그대로 호출하기 때문에, 서버나
|
|
앱은 전혀 건드릴 필요 없이 이 스크립트 하나만 라즈베리파이 같은 작은
|
|
컴퓨터에서 계속 띄워두면 됩니다.
|
|
|
|
## 준비물
|
|
|
|
- Stream Deck 오리지널/MK.2 (15키, 5x3) — USB로 라즈베리파이에 연결
|
|
- 라즈베리파이(또는 인터넷 되는 리눅스 미니PC) 1대
|
|
- 교무실 회원가입(교사 회원가입)을 마친 선생님만 목록에 뜹니다 — 아직
|
|
가입 안 한 선생님은 버튼이 안 보이니, 먼저 앱에서 "교사 회원가입"부터
|
|
해달라고 안내해주세요.
|
|
|
|
## 설치
|
|
|
|
```bash
|
|
# 1) 한글 폰트 설치 (버튼에 이름이 네모(□)로 안 뜨게)
|
|
sudo apt update
|
|
sudo apt install -y fonts-nanum
|
|
|
|
# 2) Stream Deck을 일반 사용자 권한으로 인식하게 하는 udev 규칙
|
|
# (이거 안 하면 sudo로만 인식되거나 아예 인식이 안 될 수 있어요)
|
|
sudo tee /etc/udev/rules.d/50-streamdeck.rules > /dev/null << 'UDEV'
|
|
SUBSYSTEM=="usb", ATTRS{idVendor}=="0fd9", MODE="0666"
|
|
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0fd9", MODE="0666"
|
|
UDEV
|
|
sudo udevadm control --reload-rules
|
|
sudo udevadm trigger
|
|
|
|
# 3) 파이썬 패키지 설치
|
|
python3 -m venv venv
|
|
source venv/bin/activate
|
|
pip install -r requirements.txt
|
|
|
|
# 4) 실행
|
|
python3 stream_deck_teacher_status.py
|
|
```
|
|
|
|
USB 케이블을 뽑았다 다시 꽂아야 udev 규칙이 적용되는 경우가 있어요.
|
|
|
|
## 사용법
|
|
|
|
- **선생님 이름 버튼을 그냥 누르면** → "수업 중"으로 표시됩니다.
|
|
- **과학실/도서관/출장 등 다른 위치로 표시하고 싶으면** → 화면 오른쪽 아래
|
|
"⚙ 설정" 버튼을 누르고, 뜨는 위치 목록에서 하나를 고른 뒤(예: "출장"),
|
|
이어서 그 선생님 이름 버튼을 누르면 됩니다. 한 번 적용하면 자동으로
|
|
다시 기본 모드("수업 중")로 돌아갑니다.
|
|
- 선생님이 18명을 넘어가면 자동으로 페이지가 나뉘고, "다음 ▶" 버튼으로
|
|
넘길 수 있습니다.
|
|
- 새로 교사 회원가입을 한 선생님은 최대 1분 안에 자동으로 목록에 나타납니다
|
|
(재시작 필요 없음).
|
|
|
|
## 부팅할 때 자동 실행하게 하기 (선택)
|
|
|
|
라즈베리파이를 켤 때마다 자동으로 이 스크립트가 실행되게 하려면
|
|
systemd 서비스로 등록하세요:
|
|
|
|
```bash
|
|
sudo tee /etc/systemd/system/streamdeck-teacher.service > /dev/null << 'UNIT'
|
|
[Unit]
|
|
Description=교무실 Stream Deck 선생님 위치 표시기
|
|
After=network-online.target
|
|
Wants=network-online.target
|
|
|
|
[Service]
|
|
ExecStart=/home/pi/stream_deck_teacher_status/venv/bin/python3 /home/pi/stream_deck_teacher_status/stream_deck_teacher_status.py
|
|
Restart=on-failure
|
|
RestartSec=5
|
|
User=pi
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
UNIT
|
|
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable --now streamdeck-teacher.service
|
|
```
|
|
|
|
경로(`/home/pi/...`)는 실제로 이 폴더를 둔 위치에 맞게 바꿔주세요.
|
|
로그 확인은 `journalctl -u streamdeck-teacher -f`.
|
|
|
|
## 참고
|
|
|
|
- 이 스크립트는 이 저장소(school-backend)와는 별개로, 이미 배포된
|
|
`api.backsanhi.shop`의 기존 API만 호출합니다. 서버/앱 배포와는 무관하게
|
|
라즈베리파이에서 이 파일만 갖고 있으면 바로 동작합니다.
|
|
- `python-elgato-streamdeck` 라이브러리 버전에 따라 내부 헬퍼 함수 이름이
|
|
달라서(create_key_image/create_image 등) 코드에 호환 처리를 넣어뒀지만,
|
|
혹시 실행 중 `AttributeError`가 나면 캡처해서 알려주세요.
|