HASS.Agent .NET10
Home Assistant용 현대적·경량 Windows 동반자, 알림·미디어 제어·센서·명령·원클릭 업데이트
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기오늘의 급식과 학사일정을 포스트잇처럼 보여주는 크로스플랫폼 데스크톱 위젯 (NEIS 개방포털 API)
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
오늘 우리 학교의 급식 메뉴와 학사일정을, 책상 위 포스트잇처럼 바탕화면에 붙여두는 무료 데스크톱 위젯README 전문 보기 ↗
오늘 우리 학교의 급식 메뉴와 학사일정을,
책상 위 포스트잇처럼 바탕화면에 붙여두는 무료 데스크톱 위젯
‹ › 버튼으로 날짜를 넘깁니다. 한 번 본 날은 캐시에서 바로 뜹니다.최신 릴리스에서 운영체제에 맞는 파일 하나만 받으면 됩니다. 압축을 풀 필요가 없습니다.
| OS | 파일 | 실행 방법 |
|---|---|---|
| Windows | SchoolNote-*-windows-x64.exe | 받은 파일을 더블클릭 |
| macOS | SchoolNote-*-macos.dmg | 열어서 급식쪽지를 Applications로 끌어다 놓기 |
| Linux | SchoolNote-*-linux-x64 | chmod +x 후 실행 (브라우저가 실행 권한을 떼어 냅니다) |
처음 실행할 때 경고가 뜰 수 있습니다. 코드 서명이 없는 무료 앱이라서입니다.
- Windows "PC 보호" 창 → 추가 정보 → 실행
- macOS "확인되지 않은 개발자" → 앱을 우클릭 → 열기 (한 번만 하면 됩니다)
처음 실행하면 설정 창이 열립니다. 학교 탭에서 학교를 검색해 선택하면 바로 급식이 표시됩니다.
Windows — run.bat을 두 번 클릭
macOS / Linux
./run.sh
직접 실행
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
python -m app
schoollunchmemo/
├─ app/
│ ├─ __main__.py # 진입점, 단일 인스턴스 보장, 로깅
│ ├─ controller.py # 전체 흐름 조율 (조회 → 렌더 → 상태 표시)
│ ├─ tray.py # 트레이 아이콘과 메뉴
│ ├─ sticky.py # 포스트잇 위젯
│ ├─ calendar_popup.py # 달력 팝업 (급식·일정 표시)
│ ├─ settings_dialog.py # 설정 창 (학교 / 표시 / 알레르기 / 정보)
│ ├─ config.py # 설정 로드·저장
│ ├─ autostart.py # 부팅 시 자동 시작 등록
│ ├─ cache.py # 날짜 단위 응답 캐시
│ ├─ allergens.py # 알레르기 19종 코드와 매칭
│ ├─ scheduler.py # 자정 롤오버 감지
│ ├─ updater.py # GitHub 릴리스 확인·교체 (수동 트리거)
│ ├─ workers.py # 백그라운드 작업 실행기
│ ├─ neis/
│ │ ├─ client.py # HTTP 호출, 타임아웃, 재시도
│ │ ├─ codes.py # RESULT.CODE 분류
│ │ ├─ models.py # School / MealMenu / ScheduleEvent
│ │ └─ parser.py # 응답 정규화
│ └─ resources/
│ ├─ icons.py # 아이콘 생성 (바이너리 없음)
│ └─ theme.py # 포스트잇 색상 팔레트
├─ assets/ # 실행 파일용 아이콘 (.ico/.icns)
├─ scripts/ # 아이콘 생성 등 개발 보조 스크립트
├─ docs/ # GitHub Pages 홈페이지
├─ tests/
├─ run.bat # Windows 실행 스크립트
├─ run.sh # macOS / Linux 실행 스크립트
├─ schoolnote.spec # PyInstaller 빌드 설정
├─ requirements.txt
└─ requirements-dev.txt
컨트롤러가 유일한 조율자입니다. UI 위젯은 시그널만 보내고, 네트워크는 워커 스레드에서만 돌며, 결과는 다시 컨트롤러를 거쳐 화면으로 돌아옵니다.
graph TB
subgraph UI["UI (메인 스레드)"]
TRAY[트레이 아이콘]
NOTE[포스트잇 위젯]
CAL[달력 팝업]
DLG[설정 창]
end
CTRL[AppController<br/>controller.py]
subgraph DATA["데이터 계층"]
CACHE[날짜·월 캐시<br/>cache.py]
CLIENT[NeisClient<br/>neis/client.py]
PARSER[정규화<br/>neis/parser.py]
end
WORK[워커 스레드풀<br/>workers.py]
NEIS[(NEIS Open API)]
TRAY & NOTE & CAL & DLG -- "Qt 시그널" --> CTRL
CTRL -- "캐시 우선" --> CACHE
CTRL -- "미스 시" --> WORK
WORK --> CLIENT
CLIENT -- "HTTPS (인증키 없음)" --> NEIS
CTRL --> PARSER
CTRL -- "렌더" --> NOTE & CAL
하루치 조회는 이렇게 흐릅니다. 같은 날을 다시 보면 네트워크를 타지 않습니다.
sequenceDiagram
autonumber
actor U as 사용자/자정 스케줄러
participant C as AppController
participant K as 캐시
participant N as NeisClient (워커)
participant API as NEIS API
participant S as 포스트잇
U->>C: refresh()
C->>K: load(학교, 날짜)
alt 캐시 있음
K-->>C: 저장된 rows
else 캐시 없음
C->>N: fetch_day() — 백그라운드
N->>API: 급식·학사일정 조회
API-->>N: JSON rows
N-->>C: 시그널로 전달 (UI 안 멈춤)
C->>K: save(rows)
end
C->>C: 파싱·알레르기 매칭<br/>(빈 식단 row는 걸러짐)
C->>S: 렌더
더 자세한 설계는 PRD 7장에 있습니다.
pip install -r requirements-dev.txt
pytest -q
pip install -r requirements-dev.txt
pyinstaller schoolnote.spec --noconfirm
Windows는 dist/SchoolNote.exe, Linux는 dist/SchoolNote 파일 하나가 나옵니다 (onefile).
macOS는 .app이 원래 폴더라 dist/SchoolNote.app 번들을 만들고, 배포 때 .dmg로 쌉니다.
macOS / Linux는 해당 OS에서 직접 빌드해야 합니다 (크로스 빌드 불가).
태그를 push하면 GitHub Actions가 세 플랫폼을 자동 빌드합니다.
NEIS 교육정보 개방 포털 공개 API (인증키 불필요, 일 1000건 제한)
| 서비스 | 엔드포인트 | 용도 |
|---|---|---|
| 학교기본정보 | /hub/schoolInfo | 학교 검색 |
| 급식식단정보 | /hub/mealServiceDietInfo | 급식 조회 |
| 학사일정 | /hub/SchoolSchedule | 행사·일정 조회 |
상세 파라미터와 응답 항목은 PRD 6장에 정리돼 있습니다.
MIT License — 자세한 내용은 LICENSE를 보세요. Copyright (c) 2026 Gihun Ham (@progh2)