전자종이「오늘은 금요일인가요?」+ 날씨 화면
Zectrix 400×300 흑백 전자종이에 재미있는 한 페이지를 렌더링합니다. 아이디어는 오픈소스 프로젝트 eyaeya/today-is-friday(MIT)에서 가져왔으며, 본 스킬은 흑백 전자종이에 맞게 레이아웃을 재구성하고 현지 날씨를 추가했습니다.
결과물은 assets/preview.png를 참조하세요:
- 상단: 왼쪽에「오늘은 금요일인가요?」, 오른쪽에 사용자 지역 표시 (예: 「서울·강남구」)
- 왼쪽 열: 인사말 + 재미있는 문구 2줄. 요일/시간대에 따라 문구 풀을 전환하고, 셔플백 방식으로 문장을 선택 (한 라운드 내 중복 없음)
- 오른쪽 열: 큰 날씨 아이콘 + 큰 온도 + 상태 + 자외선 지수 + HI/LO
- 하단: 오늘/내일/모레 3일 예보 + 실제 날씨에 따라 생성된 외출 복장 추천 (비 오는 날 우산, 더운 날 자외선 차단, 추운 날 옷 추가, 일교차 알림, 자외선 강할 때 선크림 바르기)
시간대 및 색상 규칙 (원 프로젝트 로직 그대로):
| 시간 | 인사말 | 색상 |
|---|---|---|
| 월요일–목요일 | 아닙니다. | 흰 바탕에 검은 글씨 |
| 금요일 16:00 이전 | 금요일이에요! | 검은 바탕에 흰 글씨 |
| 금요일 16:00 이후 | 금요일이에요! + 오른쪽 위「퇴근」도장 | 검은 바탕에 흰 글씨 |
| 토요일, 일요일 19:00 이전 | 쉬는 날. | 검은 바탕에 흰 글씨 |
| 일요일 19:00 이후 | 내일은 월요일. | 흰 바탕에 검은 글씨 |
문구 풀은 9개 (월~목 / 금 낮 / 금 밤 / 토 / 일 낮 / 일 밤), 각 풀 65개,
scripts/friday_phrases.json에 저장되어 있으며, 바로 문장을 추가하여 확장할 수 있습니다.
1. 처음 사용: 반드시 초기화 (민감 정보 없음, 내장 키 없음)
본 스킬에는 API Key, 기기 번호 또는 좌표가 포함되어 있지 않으며, 모두 사용자가 직접 준비해야 합니다. 처음 실행하기 전에 반드시 초기화해야 합니다.
cd ~/.workbuddy/skills/zectrix-friday-weather/scripts
python3 init.py # 대화형 안내, 권장
# 또는 비대화형:
python3 init.py --api-key zt_xxx --device AA:BB:CC:DD:EE:FF --place "서울 강남구" --label "서울·강남구"
사용자로부터 세 가지 정보를 수집해야 하며, 하나라도 빠지면 안 됩니다 (추측하거나 예시 값을 사용하지 마세요):
- Zectrix API Key: 사용자가 Zectrix 클라우드 콘솔에서 발급,
zt_로 시작. 확실하지 않으면 먼저python3 init.py --api-key zt_xxx --list-devices를 실행하여 장치 목록을 확인하세요. - 장치 ID: 장치 MAC 주소, 형식
AA:BB:CC:DD:EE:FF; 위 명령어 출력에서 가져올 수 있습니다. - 위치 정보: 한글 지역명, 예: 「서울 강남구」「부산 해운대구」「대전 유성구」. 스크립트는 Open-Meteo 지오코딩 서비스를 호출하여 위도/경도로 변환합니다. 여러 후보가 있을 경우 대화형으로 선택하며, 비대화형 환경에서는 첫 번째를 기본값으로 사용합니다.
초기화는 Key와 장치가 일치하는지 확인합니다 (일치하지 않으면 경고 후 종료, 인식 문제 확실 시 --no-verify 추가). 그 후 ~/.config/zectrix-friday-weather/config.json에 기록됩니다:
{
"api_key": "zt_xxx",
"device_id": "AA:BB:CC:DD:EE:FF",
"page": "5",
"location": {"label": "서울·강남구", "lat": 37.5000, "lon": 127.0000, "timezone": "Asia/Seoul"}
}
설정 및 상태는 ~/.config/zectrix-friday-weather/에 저장됩니다 (환경 변수 ZECTRIX_FRIDAY_CONFIG_DIR로 덮어쓰기 가능). 스킬 디렉터리 내에 저장되지 않으므로 키 노출 없이 안전하게 공유/업데이트할 수 있습니다.
2. 일상 사용
cd ~/.workbuddy/skills/zectrix-friday-weather/scripts
ZECTRIX_NO_PUSH=1 python3 zectrix_friday_push.py # 미리보기만 렌더링, /tmp/zectrix_friday_screen.png 생성
python3 zectrix_friday_push.py # 렌더링 후 전자종이로 푸시
초기화되지 않은 경우 스크립트는 NEED_INIT:을 출력하고 종료 코드 2로 종료됩니다. 이 경우 위 섹션에 따라 사용자가 설정 정보를 입력하도록 안내하고, Key를 임의로 생성하지 마세요.
3. 렌더링 및 레이아웃 경험 (스타일 수정 시 반드시 준수)
- 네이티브 400×300, 1:1 렌더링, 확대 후 축소하지 마세요. 이진화 임계값
THRESHOLD=128,dither=false로 푸시 (하드 임계값, 텍스트 선명도 최대) - 폰트: 기본적으로 저장소에 포함된
assets/fonts/Zfull.ttf도트 폰트 사용 (8-24px 픽셀 단위 선명, 전자종이에 가장 적합, clone 즉시 적용, 별도 설치 불필요).$ZECTRIX_FONT=/path/to/xxx.ttf로 덮어쓰기 가능, 폴백으로 시스템 PingFang / 검은 글씨 / Noto CJK 사용 - 아이콘:
draw_icon()을 두 번 사용 (먼저 선 색상 외곽 확장, 그 후 배경 색상 채우기)하여 내부 선이 없는 굵은 윤곽선 생성, 구름이 뒤의 태양을 자연스럽게 가림. ▲▼ 등 멀티바이트 기호는 작은 글꼴에서 도트 폰트로 표현되지 않을 수 있으므로 코드로 직접 그림 - 텍스트는 항상 기본 글꼴 두께, 굵게 또는 외곽선 처리 금지 (1비트 화면에서 굵게 하면 번짐)
- 오른쪽 열 아이콘+온도 전체 중앙 정렬: 먼저
d.textlength()로 온도 실제 너비 측정, 그 후 오른쪽 열 중앙선을 기준으로 조합 시작점 계산, 맑은 날 아이콘의 빛줄기는 외곽 확장, 점유 너비를 별도로 넓게 설정 - 도장 회전 시
fillcolor=255로 검은 모서리 방지; 흰색 바탕에 검은 글씨 반전 시 도장은img.paste(tcol, box, mask)를 사용하여 프레임 내 색상에 맞게 붙여넣기
4. 정기 푸시
장치는 풀 방식으로 새로고침됩니다. API가 code:0을 반환하면 성공이며, 화면은 다음 폴링 시 업데이트됩니다. 문구는 시간대에 따라 변경되므로, 매일 10:00에 한 번 푸시하도록 자동화를 권장합니다. 일요일 19:00 이후에「내일은 월요일.」을 표시하고 금요일 16:00 이후에「퇴근」도장이 나타나도록 하려면 19:00 푸시를 하나 더 추가하세요.
5. 파일 설명
| 파일 | 설명 |
|---|---|
scripts/init.py | 초기화 마법사: Key/장치/지역 수집, 지오코딩, 설정 쓰기 |
scripts/zectrix_friday_push.py | 렌더링 + 푸시 메인 스크립트 |
scripts/dev_render_sample.py | 문서 예제 이미지 생성 (요일/시간대/날씨 지정, 푸시 안 함) |
scripts/friday_phrases.json | 9×65개 문구 풀, 직접 편집하여 확장 가능 |
assets/fonts/Zfull.ttf | 포함된 도트 폰트 (기본 렌더링 폰트, 저장소와 함께 배포) |
assets/preview.png | 미리보기 이미지 |
assets/sample-friday.png | 금요일 저녁 예시 (검은 바탕에 흰 글씨 + 퇴근 도장) |
날씨 데이터는 Open-Meteo에서 제공 (무료, Key 등록 불필요), 자외선은 당일 uv_index_max 사용.