Easy-to-manage touch screens
무료 오픈소스 터치스크린으로 USB 설정 가이드, 드래그‑드롭 편집기, 로컬 제어를 제공하며 Home Assistant용으로 제작되었습니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗오늘 현장 일정과 지역별 날씨를 한 화면에서 보고, 날씨 때문에 주의 · 중지를 검토할 일정을 표시합니다. (교육용 가상 데이터)
index.html 더블클릭으로 엽니다. CDN과 Supabase·날씨 API 접속을 위해 인터넷 연결이 필요합니다.| 파일 | 역할 |
|---|---|
| index.html | 화면 구조 |
| style.css | 디자인 |
| logic.js | 판단 규칙, 날씨 API 주소 생성·응답 해석, Markdown 생성 |
| app.js | 화면 동작, Supabase 일정 조회·추가, 날씨 API 호출 |
| config.js | 브라우저·서버 공용 Supabase 주소와 공개용 키 두 줄 |
| api/kma.js | Vercel에서 지역별 DB 일정·기상청 날씨·판단 JSON 조회 |
| tests/kma.test.js | 기상청 처리·서버 API·공용 설정 회귀 테스트 |
| setup.sql | DB 표·제약·권한·RLS·기본 가상 일정 6건 설정 |
| data/tasks.json | 이전 F-05 실습 자료 (현재 앱은 읽지 않음) |
| PRD.md | 무엇을 · 왜 만드는지 |
| CLAUDE.md | AI가 지킬 작업 규칙 |
| .gitignore | GitHub에 올리지 않을 파일 목록 |
Supabase 프로젝트의 SQL Editor에서 setup.sql 전체를 실행합니다. 앱은 SQL을 자동 실행하지 않습니다. public.wx_tasks가 없는 프로젝트에서 시작하는 설정이며, 이 스크립트로 만든 표에는 다시 실행해도 기본 일정이 중복되지 않습니다.
Supabase 프로젝트의 Connect 또는 Settings → API Keys에서 프로젝트 주소와 Publishable key를 확인합니다. 기존 anon key도 사용할 수 있습니다. 비밀 키인 Secret key / service_role key는 사용하지 마세요.
config.js의 두 줄에 직접 입력합니다. 이 파일은 브라우저에서 읽히며, 공개용 키는 RLS가 허용하는 조회·추가에만 사용됩니다.
(typeof module === 'undefined' ? globalThis : module.exports).SUPABASE_URL = 'https://YOUR_PROJECT.supabase.co';
(typeof module === 'undefined' ? globalThis : module.exports).SUPABASE_PUBLIC_KEY = 'sb_publishable_YOUR_PUBLIC_KEY';
페이지를 열어 기본 일정 6건을 확인합니다. 설정 변경을 배포 사이트에 반영하려면 변경한 config.js도 배포해야 합니다.
wx_tasks는 id, title, region, kind, owner, created_at 열을 가집니다. 목록은 id 오름차순으로 읽습니다.NOT NULL·CHECK가 빈 일정명·담당, 지역(세종·대전·태안·보령)과 구분(야외·고소·실내) 외의 값을 거부합니다.wx_added와 JSON 자료는 자동으로 이관하거나 삭제하지 않습니다.supabase-js 하나뿐입니다.Asia/Seoul) 기준 오늘 하루 예보를 요청합니다.temperature_2m_max), 최대 풍속(wind_speed_10m_max, wind_speed_unit=ms), 최대 강수확률(precipitation_probability_max)을 표시합니다.https://배포주소/api/kma?region=대전 (GET). 세종·대전·태안·보령만 지정할 수 있습니다.wx_tasks에서 해당 지역의 일정을 조회하고, 기상청 오늘 날씨와 일정별 judgment를 반환합니다. 일정이 없으면 tasks: []입니다.config.js에 넣지 않습니다.getVilageFcst입니다. 해당 서비스의 활용 승인이 필요합니다. 기상청 API허브에서 발급한 키는 이 호출에 사용할 수 없습니다. 발급처는 아직 확인되지 않아 공공데이터포털을 전제로 구현했습니다.forecast.baseDate·baseTime이 사용한 발표 시각입니다. 기온 TMP·최고기온 TMX, 풍속 WSD, 강수확률 POP로 일별 최댓값을 계산합니다. 바람은 m/s입니다. 필요한 24시간 값이 누락되면 날씨를 미수신으로 처리합니다.weather: null과 warning이 나오며 DB 일정은 남습니다. 실내는 ‘영향 없음’, 그 외는 ‘날씨 확인 전’입니다. DB 실패는 502, 설정 오류는 503이며 다른 자료로 대체하지 않습니다. 외부 요청에는 8초 제한을 둡니다.응답 구조 예시입니다. 숫자와 일정은 설명용 가상 값입니다.
{
"date": "2026-10-27",
"region": "대전",
"source": "기상청 단기예보 (공공데이터포털)",
"forecast": { "baseDate": "20261026", "baseTime": "2300", "timezone": "Asia/Seoul" },
"units": { "tempMax": "℃", "windMax": "m/s", "rainProb": "%" },
"weather": { "tempMax": 25, "windMax": 3, "rainProb": 20 },
"warning": null,
"tasks": [
{
"id": 1, "title": "가상 점검", "region": "대전", "kind": "야외", "owner": "가상담당",
"weather": { "tempMax": 25, "windMax": 3, "rainProb": 20 },
"judgment": { "level": "ok", "text": "진행" }
}
]
}
T-01: SQL 실행과 연결 설정 후 페이지를 열어 DB의 기본 일정 6건이 보이는지 확인합니다. DB에 추가한 일정이 있으면 함께 표시됩니다.
T-02: 가상 일정을 추가해 맨 아래에 보이고, Supabase Table Editor에도 저장되는지 확인합니다. 새로고침 후에도 남아야 합니다. 날씨 수신 후 추가한 일정에도 해당 지역의 날씨와 판단이 표시됩니다.
T-03: 인터넷에 연결한 상태로 열어 4개 지역의 최고 기온·최대 풍속(m/s)·강수확률과 판단을 확인합니다. 같은 지역 일정은 같은 날씨를 사용합니다. 실제 예보에 따라 지역 간 일부 값은 같을 수 있습니다.
T-04: 브라우저 주소 끝에 ?test=wind를 붙여 엽니다 (index.html?test=wind). 모든 지역의 풍속이 12 m/s로 표시되고 기본 고소 일정 2건이 ‘중지 검토’인지 확인합니다. 상단에 시험값 안내가 표시됩니다. API 실패 시에도 풍속만 시험값으로 표시하고, 기온·강수확률은 ‘미수신’으로 남깁니다. 시험을 끝내려면 쿼리 문자열을 제거합니다.
T-01·T-03 실패 상황: ?test=wind를 제거하고 개발자 도구에서 날씨 API 요청만 차단한 뒤 새로고침합니다. DB 일정 목록은 유지되고, 상단에 실패 지역이 표시되며 실외 일정은 ‘날씨 확인 전’, 실내 일정은 ‘영향 없음’인지 확인합니다.
T-05·T-06: 이전 JSON 로딩·파일 실패 안내 검사는 F-06에서 아래 T-08·T-09로 대체합니다.
T-07: ‘오늘 판단 md로 저장’을 눌러 현장일정_판단_YYYY-MM-DD.md가 내려받아지는지 확인합니다. 날짜는 한국 시간 기준입니다. 파일을 열어 현재 표의 6개 열과 추가 일정이 같은 순서로 들어 있고, 맨 아래 판단 기준에 풍속 10 m/s·강수확률 60%·기온 33℃가 있는지 확인합니다. 날씨 미수신 상태와 ?test=wind에서도 현재 표가 저장되며, 시험 모드에서는 시험값 안내가 포함됩니다. 일정 이름에 |, 줄바꿈, < 등이 있어도 Markdown 표가 유지되는지 확인합니다.
T-08: 브라우저 A에서 가상 일정을 추가하고 브라우저 B(또는 시크릿 창)에서 새로고침해 같은 일정이 보이는지 확인합니다. 이전 Local Storage가 목록에 섞이지 않아야 합니다.
T-09: 빈 연결 설정, CDN 차단, DB 조회 차단 시 각각 안내가 보이고 추가 버튼이 비활성화되는지 확인합니다. 목록을 받은 후 DB 저장 요청을 차단해 추가하면 기존 목록과 입력이 유지되고 저장 실패 안내가 보여야 합니다.
T-10: SQL Editor에서 아래 검증 SQL을 실행합니다. 각각 의도적으로 실패해야 하며, 실패한 문장은 한 번에 하나씩 실행합니다. 정상 기본 일정은 그대로 남습니다.
-- 지역·구분 CHECK 제약 (각 문장을 따로 실행)
insert into public.wx_tasks (title, region, kind, owner)
values ('가상 제약 검사', '서울', '야외', '가상담당');
insert into public.wx_tasks (title, region, kind, owner)
values ('가상 제약 검사', '세종', '기타', '가상담당');
T-11: SQL Editor에서 다음 블록을 실행하면 permission denied로 실패해야 합니다. 실패 후 rollback;을 실행해 테스트 트랜잭션을 끝냅니다. setup.sql 재실행 후 기본 일정이 중복되지 않는지도 확인합니다.
begin;
set local role anon;
delete from public.wx_tasks where false;
rollback;
T-12: 최신 배포의 /api/kma?region=대전을 열어 tasks가 DB의 대전 일정과 일치하는지 확인합니다. 다른 3개 지역도 확인합니다. weather 값과 judgment를 확인합니다.
T-13: ?region=서울, 지역 생략, ?region=대전®ion=세종은 400인지, POST는 405인지 확인합니다. DB 설정이 잘못되거나 DB 조회가 실패하면 성공한 빈 목록으로 위장하지 않고 503·502가 나와야 합니다.
T-14: 테스트 배포에서 KMA_KEY를 빼거나 날씨 호출이 실패하도록 설정하면 DB 일정과 weather: null, warning이 나오는지 확인합니다. 응답에 인증키가 없어야 합니다. 점검 후 환경변수를 복구하고 재배포합니다.
T-15: Node.js가 설치된 PC에서 node --test tests/kma.test.js를 실행합니다. 실제 외부 API·DB 변경 없이 한국 날짜·최댓값·예보 누락·규칙·서버 오류·공용 설정·화면 기능을 검증합니다.