Skip to content

redchupa/kr_component_kit

Repository files navigation

πŸ‡°πŸ‡· KR Component Kit

ν•œκ΅­ 거주자λ₯Ό μœ„ν•œ Home Assistant 톡합 β€” μ „κΈ°Β·μˆ˜λ„Β·κ°€μŠ€Β·λ‚ μ”¨Β·μž¬λ‚œΒ·μ•½κ΅­Β·ν•™κ΅ κΈ‰μ‹Β·μ‹€μ‹œκ°„ λŒ€μ€‘κ΅ν†΅κΉŒμ§€, ν•œκ΅­μ—μ„œλ§Œ μ“Έ 수 μžˆλŠ” 15κ°€μ§€ 곡곡 μ„œλΉ„μŠ€λ₯Ό ν•œ νŒ¨ν‚€μ§€λ‘œ.

πŸ‡°πŸ‡· ν•œκ΅­μ–΄ (이 νŽ˜μ΄μ§€) Β· πŸ‡¬πŸ‡§ English README

hacs GitHub Release GitHub Activity License Stargazers

Open your Home Assistant instance and open a repository inside the HACS.

πŸ‡¬πŸ‡§ English summary

A Home Assistant custom integration for Korean residents and expats. Exposes 15 Korea-only public services (KEPCO electricity, Seoul water, city gas, KMA weather, disaster alerts, NMC pharmacy, NEIS school meals, Seoul subway + Seoul Bus official API + nationwide bus via KakaoMap, AirKorea air quality, Opinet fuel prices, earthquake warnings) as native HA entities β€” sensors, weather entities, events, calendars.

All Korean public APIs are free; service keys are obtained from data.go.kr, safetydata.go.kr, opinet.co.kr, open.neis.go.kr, and data.seoul.go.kr β€” guides below link directly to each portal's search page.

Optional LLM integration lets you ask in natural Korean ("μ§€κΈˆ λ―Έμ„Έλ¨Όμ§€ μ–΄λ•Œ?", "였늘 급식 뭐야?") via HA's Assist conversation agent.


πŸš€ 5λΆ„ λ§Œμ— μ‹œμž‘ν•˜κΈ°

β‘  μ»΄ν¬λ„ŒνŠΈ μ„€μΉ˜ (2λΆ„)

μœ„ MY HACS 뱃지λ₯Ό λˆ„λ₯΄λ©΄ μžλ™μœΌλ‘œ HAκ°€ μ—΄λ¦½λ‹ˆλ‹€ β†’ DOWNLOAD β†’ μž¬μ‹œμž‘. HACSκ°€ μ—†μœΌμ‹œλ‹€λ©΄ β†’ HACS 곡식 μ„€μΉ˜ κ°€μ΄λ“œ λ¨Όμ €.

β‘‘ 첫 μ„œλΉ„μŠ€ 등둝 (1λΆ„) β€” API ν‚€ ❌ λΆˆν•„μš”

μ„€μ • β†’ κΈ°κΈ° 및 μ„œλΉ„μŠ€ β†’ + 톡합 κ΅¬μ„±μš”μ†Œ μΆ”κ°€ β†’ 검색창에 ν•œκ΅­ μ»΄ν¬λ„ŒνŠΈ ν‚€νŠΈ (영문 도메인 kr_component_kit 도 κ°€λŠ₯) β†’ 🚨 μ•ˆμ „μ•Œλ¦Ό 선택 β†’ μ‹œλ„/μ‹œκ΅°κ΅¬/읍면동 선택 β†’ 제좜

β‘’ κ²°κ³Ό 확인 (30초)

개발자 도ꡬ β†’ μƒνƒœ μ—μ„œ μΉœν™” 이름 μ΅œμ‹  μ•ˆμ „μ•Œλ¦Ό 검색 β†’ state에 κ°€μž₯ 졜근 ν–‰μ•ˆλΆ€ μ•ˆμ „ λ©”μ‹œμ§€ ν‘œμ‹œ.

β‘£ 더 λ§Žμ€ μ„œλΉ„μŠ€ μΆ”κ°€

μ€€λΉ„λ˜μ‹œλ©΄ πŸ”‘ API ν‚€ λ°œκΈ‰ κ°€μ΄λ“œλŒ€λ‘œ λ‹€λ₯Έ 12개λ₯Ό ν•˜λ‚˜μ”© μΆ”κ°€ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.


πŸ“‹ 15κ°€μ§€ μ„œλΉ„μŠ€ ν•œλˆˆμ—

μ„œλΉ„μŠ€ μΉ΄ν…Œκ³ λ¦¬ API ν‚€ λΉ„κ³ 
πŸ’Š μ•½κ΅­ μƒν™œ βœ… data.go.kr μ‹œλ„/μ‹œκ΅°κ΅¬λ³„ μ•½κ΅­ + μ‹€μ‹œκ°„ μ˜μ—…μ€‘
🚨 μ•ˆμ „μ•Œλ¦Ό μ•ˆμ „ ❌ λΆˆν•„μš” ν–‰μ•ˆλΆ€ μ•ˆμ „μ•Œλ¦Ό (μŠ€ν¬λž˜ν•‘)
πŸ“’ μž¬λ‚œλ¬Έμž μ•ˆμ „ βœ… safetydata.go.kr μž¬λ‚œλ¬Έμž μ‹€μ‹œκ°„
πŸŒͺ️ κΈ°μƒνŠΉλ³΄ μ•ˆμ „ βœ… data.go.kr 호우/강풍/ν•œνŒŒ/폭염 12μ’…
🌍 μ§€μ§„ μ•ˆμ „ βœ… data.go.kr 반경+규λͺ¨ ν•„ν„°
β›… 기상청 λ™λ„€μ˜ˆλ³΄ 날씨 βœ… data.go.kr HA Weather μΉ΄λ“œ ν˜Έν™˜
🌫️ 에어코리아 날씨 βœ… data.go.kr (2건) PM10/PM2.5 + ν†΅ν•©λŒ€κΈ°μ§ˆμ§€μˆ˜
⚑ ν•œκ΅­μ „λ ₯ (KEPCO) μœ ν‹Έ ❌ (본인 계정) μ‚¬μš©λŸ‰ + μš”κΈˆ
πŸ’§ μ•„λ¦¬μˆ˜ (μ„œμšΈ μƒμˆ˜λ„) μœ ν‹Έ ❌ (μˆ˜μš©κ°€λ²ˆν˜Έ) μ„œμšΈλ§Œ
🏠 κ°€μŠ€μ•± (λ„μ‹œκ°€μŠ€) μœ ν‹Έ ❌ (λͺ¨λ°”일 μ•± 토큰) νŒ¨ν‚· 캑처 ν•„μš”
β›½ μœ κ°€ (Opinet) μƒν™œ βœ… opinet.co.kr μ‹œλ„λ³„ 평균/μ΅œμ €κ°€
🏫 학ꡐ (NEIS) μƒν™œ βœ… open.neis.go.kr κΈ‰μ‹Β·μ‹œκ°„ν‘œΒ·ν•™μ‚¬μΌμ •
🚌 λŒ€μ€‘κ΅ν†΅ μƒν™œ λΆ€λΆ„ μ§€ν•˜μ² : μ„œμšΈ ν‚€ / λ²„μŠ€: ν‚€ λΆˆν•„μš” (카카였맡)
🚌 μ„œμšΈλ²„μŠ€ (곡식 API) μƒν™œ βœ… data.go.kr ARS-ID λ‹¨μœ„ 도착정보 + μ˜΅μ…˜μ—μ„œ μ •λ₯˜μž₯ μΆ”κ°€/제거
🚍 ν•œκ΅­ λ²„μŠ€ (μ „κ΅­) μƒν™œ ❌ λΆˆν•„μš” 카카였맡 λͺ¨λ°”일 β€” μ •λ₯˜μž₯ 이름 검색 UI, μ „κ΅­

πŸ’‘ 핡심: λͺ¨λ“  μ„œλΉ„μŠ€λŠ” 무료 정뢀·곡곡기관 OpenAPIλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 결제·과금 일절 μ—†μŒ.


πŸ”‘ API ν‚€ λ°œκΈ‰ κ°€μ΄λ“œ

⚠️ 자주 λ°œμƒν•˜λŠ” μ‹€μˆ˜ 3κ°€μ§€

  • μž¬λ‚œλ¬ΈμžλŠ” safetydata.go.kr (μ•ˆμ „λ°μ΄ν„°ν¬ν„Έ) β€” data.go.kr (곡곡데이터포털) κ³Ό λ‹€λ₯Έ 포털. 계정·킀 뢄리.
  • 같은 data.go.kr μ•ˆμ—μ„œλ„ λ°μ΄ν„°μ…‹λ§ˆλ‹€ ν™œμš©μ‹ μ²­μ„ λ”°λ‘œ β€” μ•½κ΅­ μ‹ μ²­ ν‚€λ‘œ κΈ°μƒνŠΉλ³΄ ν˜ΈμΆœν•˜λ©΄ 403.
  • μ‹ μ²­ 직후 ν™œμ„±ν™”κΉŒμ§€ 1~2μ‹œκ°„ 걸릴 수 있음 (특히 μš΄μ˜κΈ°κ΄€ ν‚€).

각 μ„œλΉ„μŠ€μ˜ λ°”λ‘œ 검색 λ§ν¬λŠ” 클릭 ν•œ λ²ˆμ— ν•΄λ‹Ή 포털 검색 κ²°κ³Ό νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•©λ‹ˆλ‹€ (λΈŒλΌμš°μ €κ°€ ν•œκ΅­μ–΄ μžλ™ 인코딩).

πŸ’Š μ•½κ΅­ (μ „κ΅­ μ•½κ΅­ 정보)

ν•­λͺ© κ°’
🌐 포털 곡곡데이터포털 (data.go.kr)
πŸ”Ž λ°”λ‘œ 검색 πŸ‘‰ μ „κ΅­ μ•½κ΅­ 검색 결과둜 이동
검색어 μ „κ΅­ μ•½κ΅­ λ˜λŠ” μ•½κ΅­ 정보
μš΄μ˜κΈ°κ΄€ κ΅­λ¦½μ€‘μ•™μ˜λ£Œμ› (μ½”λ“œ B552657)
μ •ν™•ν•œ 데이터셋λͺ… κ΅­λ¦½μ€‘μ•™μ˜λ£Œμ›_μ „κ΅­ μ•½κ΅­ 정보 쑰회 μ„œλΉ„μŠ€
μ½”λ“œ 호좜 endpoint apis.data.go.kr/B552657/ErmctInsttInfoInqireService/getParmacyListInfoInqire

μ‹ μ²­ 단계: νšŒμ›κ°€μž… β†’ μœ„ 검색 링크 클릭 β†’ 데이터셋 선택 β†’ ν™œμš©μ‹ μ²­ β†’ λ§ˆμ΄νŽ˜μ΄μ§€ β†’ μ˜€ν”ˆAPI β†’ 인증킀 λ°œκΈ‰ν˜„ν™© β†’ 일반 인증킀(Decoding) 볡사 β†’ HA μ•½κ΅­ ν•­λͺ©μ— κ·ΈλŒ€λ‘œ λΆ™μ—¬λ„£κΈ°.


πŸ“’ μž¬λ‚œλ¬Έμž (βœ… μž‘λ™ 검증 μ™„λ£Œ β€” 2026-05-14)

ν•­λͺ© κ°’
🌐 포털 ν–‰μ •μ•ˆμ „λΆ€ μ•ˆμ „λ°μ΄ν„°κ³΅μœ ν”Œλž«νΌ (safetydata.go.kr)
μš΄μ˜κΈ°κ΄€ ν–‰μ •μ•ˆμ „λΆ€
μ •ν™•ν•œ 데이터셋λͺ… ν–‰μ •μ•ˆμ „λΆ€_κΈ΄κΈ‰μž¬λ‚œλ¬Έμž
μ½”λ“œ 호좜 endpoint /V2/api/DSSP-IF-00247
λ°œκΈ‰ 방식 운영자 κ²€ν†  ν›„ λ°œκΈ‰ (μ¦‰μ‹œ μžλ™ λ°œκΈ‰ ❌, 1~3 μ˜μ—…μΌ)
일일 호좜 ν•œλ„ κΈ°λ³Έ 1,000건. 톡합은 5λΆ„ 폴링이라 288건/일 μ‚¬μš© β†’ μΆ©λΆ„
ν‚€ μœ νš¨κΈ°κ°„ 1λ…„ (만료 ν›„ λ§ˆμ΄νŽ˜μ΄μ§€μ—μ„œ μž¬λ°œκΈ‰ β€” 만료일자 ν™”λ©΄μ—μ„œ 확인)
ν‚€ ν˜•νƒœ 단일 ν˜•νƒœλ§Œ 제곡 (data.go.kr 처럼 Decoding/Encoding 두 κ°€μ§€ ❌)
IP ν•„μˆ˜ ⚠️ μ‹ μ²­μ„œμ— ν˜ΈμΆœν•  IP 등둝 ν•„μˆ˜ (μ•„λž˜ 3️⃣ μ°Έκ³ )

⚠️ μ•ˆμ „λ°μ΄ν„°κ³΅μœ ν”Œλž«νΌμ€ 곡곡데이터포털과 λ‹€λ₯Έ μ‚¬μ΄νŠΈμž…λ‹ˆλ‹€. 이미 data.go.kr 계정이 μžˆμ–΄λ„ 별도 κ°€μž…μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

1️⃣ νšŒμ›κ°€μž…

safetydata.go.kr νšŒμ›κ°€μž…. data.go.kr κ³„μ •μœΌλ‘œλŠ” λ‘œκ·ΈμΈλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

2️⃣ 데이터셋 선택 (⚠️ 두 μΉ΄λ“œ ν—·κ°ˆλ¦¬κΈ° 쉬움)

상단 검색창에 μž¬λ‚œλ¬Έμž β†’ 검색 κ²°κ³Ό μΉ΄λ“œλ₯Ό 보면 두 κ°œκ°€ λ‚˜μ˜΅λ‹ˆλ‹€:

μΉ΄λ“œ μ‚¬μš© μ—¬λΆ€
ν–‰μ •μ•ˆμ „λΆ€_κΈ΄κΈ‰μž¬λ‚œλ¬Έμž (쑰회 5만+ / λ‹€μš΄λ‘œλ“œ 28M / #μž¬λ‚œλ¬Έμž νƒœκ·Έ) βœ… 이걸 μ‹ μ²­
μž¬λ‚œλ¬Έμž(속보) (쑰회 900+ / νƒœκ·Έ #-1) ❌ endpoint μ½”λ“œκ°€ 달라 톡합과 ν˜Έν™˜ μ•ˆ 됨

μ˜¬λ°”λ₯Έ μΉ΄λ“œ 클릭 β†’ 상세 νŽ˜μ΄μ§€μ—μ„œ endpoint κ°€ DSSP-IF-00247 인지 ν•œ 번 확인.

3️⃣ ν™œμš©μ‹ μ²­ 폼 μž‘μ„±

상세 νŽ˜μ΄μ§€ β†’ μ˜€ν”ˆAPI ν™œμš©μ‹ μ²­ λ²„νŠΌ β†’ 폼 μž‘μ„±:

β‘  ν™œμš©λͺ©μ  (ν•„μˆ˜)

  • μΉ΄ν…Œκ³ λ¦¬: μ•±κ°œλ°œ (λͺ¨λ°”일, μ†”λ£¨μ…˜ λ“±) ꢌμž₯
  • μ„€λͺ… μ˜ˆμ‹œ: "ν™ˆμ–΄μ‹œμŠ€ν„΄νŠΈ(Home Assistant) μ»΄ν¬λ„ŒνŠΈλ‘œ κ°€μ‘±Β·λ³ΈμΈμ—κ²Œ κΈ΄κΈ‰μž¬λ‚œλ¬Έμž μ•Œλ¦Όμ„ λ°›κ²Œ ν•  λͺ©μ "

β‘‘ ν•˜λ£¨ μ΅œλŒ€ 호좜 횟수 (ν•„μˆ˜)

  • 1000 μž…λ ₯. 톡합이 5λΆ„ 주기둜 288회/일만 μ‚¬μš©ν•˜λ―€λ‘œ μΆ©λΆ„ν•©λ‹ˆλ‹€.

β‘’ 아이피 (ν•„μˆ˜) β€” κ°€μž₯ μ€‘μš”ν•œ λΆ€λΆ„ 호좜이 λ“€μ–΄μ˜¬ HA μ„œλ²„μ˜ 곡인(μ™ΈλΆ€) IP λ₯Ό 등둝해야 ν•©λ‹ˆλ‹€. 등둝 IP와 μ‹€μ œ 호좜 IPκ°€ λ‹€λ₯΄λ©΄ ν‚€κ°€ λ°œκΈ‰λΌλ„ 403 κ±°λΆ€.

μ˜΅μ…˜ μž…λ ₯ μ˜ˆμ‹œ μΆ”μ²œλ„
개인 IP 121.123.45.67 κ°€μž₯ 엄격. ν•˜μ§€λ§Œ ν•œκ΅­ κ°€μ •μš© 인터넷은 dynamic IP 라 λ©°μΉ ~λͺ‡ 달 μ•ˆμ— λ°”λ€œ β†’ μž¬μ‹ μ²­ ν•„μš”
λŒ€μ—­ ν—ˆμš© 121.123.*.* ISPκ°€ λΉ„μŠ·ν•œ λŒ€μ—­ μ•ˆμ—μ„œ κ°±μ‹ ν•΄μ£ΌλŠ” 경우 μ•ˆμ „. 일반적으둜 λ¬΄λ‚œ
전체 ν—ˆμš© *.*.*.* ⭐ 개인 μ‚¬μš©μž μΆ”μ²œ β€” IP λ³€κ²½ μ‹ κ²½ μ•ˆ 써도 됨. ν‚€ μžμ²΄κ°€ 비밀이라 λ³΄μ•ˆ 영ν–₯ λ―Έλ―Έ

πŸ”Ž HA μ„œλ²„μ˜ 곡인 IP 확인 방법: λΆ€κ°€κΈ°λŠ₯ β†’ Terminal & SSH (λ˜λŠ” SSH둜 접속) β†’ λ‹€μŒ λͺ…λ Ή μ‹€ν–‰:

curl -s https://api.ipify.org

좜λ ₯된 IPκ°€ μ‹ μ²­μ„œμ— 넣을 κ°’.

β‘£ λΌμ΄μ„ μŠ€ λ™μ˜ β†’ μ΄μš©μ‹ μ²­ λ²„νŠΌ 클릭.

4️⃣ 승인 λŒ€κΈ°

λ§ˆμ΄νŽ˜μ΄μ§€ β†’ "데이터 ν™œμš©μ‹ μ²­ λ‚΄μ—­" μ—μ„œ μƒνƒœ 확인:

  • "승인 λŒ€κΈ° μ€‘μž…λ‹ˆλ‹€" β†’ 운영자 κ²€ν†  쀑. μžλ™ λ°œκΈ‰μ΄ μ•„λ‹ˆλ―€λ‘œ μ˜μ—…μΌ κΈ°μ€€ 1~3일 정도 λŒ€κΈ° μ˜ˆμƒ.
  • "λ°œκΈ‰λ¨" β†’ μ„œλΉ„μŠ€ν‚€ 값이 λ…ΈμΆœλ˜κ³  ν‚€ μ‚¬μš© κ°€λŠ₯.

5️⃣ ν‚€ 볡사 β†’ HA μž…λ ₯

λ§ˆμ΄νŽ˜μ΄μ§€ β†’ λ°œκΈ‰λœ ν‚€ μ˜† "κ°’ λ³΅μ‚¬ν•˜κΈ°" 클릭 β†’ HA 톡합 μΆ”κ°€ μ‹œ μž¬λ‚œλ¬Έμž 선택 β†’ 인증킀 ν•„λ“œμ— κ·ΈλŒ€λ‘œ λΆ™μ—¬λ„£κΈ°.

πŸ’‘ safetydata.go.kr 은 ν‚€λ₯Ό ν•œ κ°€μ§€ ν˜•νƒœλ‘œλ§Œ μ œκ³΅ν•©λ‹ˆλ‹€ (data.go.kr 의 Decoding/Encoding ꡬ뢄 μ—†μŒ). "κ°’ λ³΅μ‚¬ν•˜κΈ°" 둜 받은 λ¬Έμžμ—΄μ„ κ·ΈλŒ€λ‘œ λΆ™μ—¬λ„£μœΌλ©΄ λ©λ‹ˆλ‹€. 톡합 μ½”λ“œκ°€ λ‚΄λΆ€μ μœΌλ‘œ URL 인코딩을 μžλ™ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

πŸ” 사후 관리

  • ν˜ΈμΆœλŸ‰ λͺ¨λ‹ˆν„°λ§: λ§ˆμ΄νŽ˜μ΄μ§€ ν™”λ©΄μ˜ μΌμΌν˜ΈμΆœλŸ‰ / ν˜ΈμΆœλŸ‰ ν‘œμ‹œ β€” μ•ž μˆ«μžκ°€ ν•œλ„(1000), λ’€ μˆ«μžκ°€ ν˜„μž¬κΉŒμ§€ λˆ„μ  μ‚¬μš© 횟수 (0이면 "μ΅œλŒ€" κ°€ μ•„λ‹ˆλΌ "아직 μ•ˆ 씀"). ν•œλ„ 초과 μ‹œ λ‹€μŒ λ‚  0μ‹œ 리셋.
  • IP λ³€κ²½ μ‹ μ²­: κ°€μ •μš© dynamic IP κ°€ 바뀐 경우 λ§ˆμ΄νŽ˜μ΄μ§€ β†’ ν•΄λ‹Ή ν‚€ β†’ λͺ©λ‘ λ³€κ²½μ‹ μ²­ β†’ IP ν•„λ“œ μˆ˜μ •. ⚠️ λ³€κ²½ μ—­μ‹œ 운영자 κ²€ν†  κ±°μΉ¨. 자주 바뀐닀면 μ²˜μŒλΆ€ν„° *.*.*.* 둜 λ³€κ²½ μ‹ μ²­ ꢌμž₯.
  • ν‚€ 만료 (1λ…„): 만료일자 λ„λž˜ 전에 λ§ˆμ΄νŽ˜μ΄μ§€ β†’ λ³€κ²½μ‹ μ²­μœΌλ‘œ κ°±μ‹  κ°€λŠ₯. 만료되면 401 λ°œμƒ.

πŸ†˜ μž‘λ™ μ•ˆ 될 λ•Œ

증상 원인 후보 ν•΄κ²°
401 / SERVICE KEY ERROR ν‚€ ν™œμ„±ν™” μ „ / 만료 / 볡사 μ‹œ 곡백 포함 λ°œκΈ‰ 직후라면 30λΆ„~1μ‹œκ°„ λŒ€κΈ° ν›„ μž¬μ‹œλ„. 만료일자 확인. ν‚€ μ•žλ’€ κ³΅λ°±Β·λ”°μ˜΄ν‘œ 제거 ν›„ μž¬μž…λ ₯
403 / ACCESS_DENIED IP 뢈일치 (κ°€μž₯ 흔함) curl -s https://api.ipify.org 결과와 λ§ˆμ΄νŽ˜μ΄μ§€ 등둝 IP 비ꡐ. 뢈일치면 λͺ©λ‘ λ³€κ²½μ‹ μ²­ 으둜 IP μˆ˜μ •. 자주 바뀐닀면 *.*.*.* 둜 κ°±μ‹ 
응닡이 λΉ„μ—ˆμŒ / body [] 정상 β€” 졜근 μž¬λ‚œλ¬Έμžκ°€ μ—†λŠ” μ‹œκ°„λŒ€ μ‘°μš©ν•œ μ‹œκ°„μ—λŠ” 빈 응닡이 정상. 큰 μž¬λ‚œΒ·κΈ°μƒνŠΉλ³΄ μ‹œ μ±„μ›Œμ§

πŸŒͺ️ κΈ°μƒνŠΉλ³΄ + 🌍 μ§€μ§„ + β›… λ™λ„€μ˜ˆλ³΄ (기상청 3μ’… β€” 같은 인증킀)

μ„Έ 데이터셋 λͺ¨λ‘ data.go.kr μš΄μ˜κΈ°κ΄€ 기상청 (1360000). μΈμ¦ν‚€λŠ” λ‚΄ κ³„μ •μ˜ ν•˜λ‚˜μ˜ ν‚€λ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜μ§€λ§Œ, ν™œμš©μ‹ μ²­μ€ 각각 λ”°λ‘œ ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ„œλΉ„μŠ€ λ°”λ‘œ 검색 검색어 endpoint
πŸŒͺ️ κΈ°μƒνŠΉλ³΄ πŸ‘‰ κΈ°μƒνŠΉλ³΄ 검색 κΈ°μƒνŠΉλ³΄ 1360000/WthrWrnInfoService
🌍 지진정보 πŸ‘‰ 지진정보 검색 지진정보 1360000/EqkInfoService
β›… λ‹¨κΈ°μ˜ˆλ³΄ πŸ‘‰ λ‹¨κΈ°μ˜ˆλ³΄ 검색 λ‹¨κΈ°μ˜ˆλ³΄ 1360000/VilageFcstInfoService_2.0

🌫️ 에어코리아 (λŒ€κΈ°μ§ˆ) β€” 2건 ν•„μˆ˜

data.go.kr μš΄μ˜κΈ°κ΄€ ν•œκ΅­ν™˜κ²½κ³΅λ‹¨ (B552584) 의 데이터셋 2건을 각각 ν™œμš©μ‹ μ²­ν•΄μ•Ό ν•©λ‹ˆλ‹€.

데이터셋 λ°”λ‘œ 검색 검색어 endpoint
μΈ‘μ •μ†Œμ •λ³΄ πŸ‘‰ μΈ‘μ •μ†Œμ •λ³΄ 에어코리아 μΈ‘μ •μ†Œ B552584/MsrstnInfoInqireSvc
λŒ€κΈ°μ˜€μ—Όμ •λ³΄ πŸ‘‰ λŒ€κΈ°μ˜€μ—Όμ •λ³΄ 에어코리아 λŒ€κΈ°μ˜€μ—Ό B552584/ArpltnInforInqireSvc

πŸ’‘ μΈ‘μ •μ†Œμ •λ³΄ λΉ μ§€λ©΄ HA μ„€μ • ν™”λ©΄μ˜ μΈ‘μ •μ†Œ dropdown이 λΉ„μ–΄ λ³΄μž…λ‹ˆλ‹€.

⚠️ μ˜΅μ…˜ β€” μƒν™œκΈ°μƒμ§€μˆ˜ (UVΒ·λŒ€κΈ°μ •μ²΄): μ‚¬μš©ν•˜λ €λ©΄ μΆ”κ°€λ‘œ μƒν™œκΈ°μƒμ§€μˆ˜ 검색 β†’ 기상청 데이터셋 ν™œμš©μ‹ μ²­. 단 μ½”λ“œλŠ” V4 endpoint ν˜ΈμΆœμ΄μ§€λ§Œ 포털은 V5둜 μ—…κ·Έλ ˆμ΄λ“œλœ μƒνƒœλ‘œ λ³΄μž…λ‹ˆλ‹€ β€” μ‹€μ œ λ™μž‘ 미검증. 등둝 ν›„ HA 둜그(LivingWthrIdx 검색)둜 ν™•μΈν•˜μ„Έμš”. λ―Έμž‘λ™ μ‹œ issue λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.


β›½ μœ κ°€ (Opinet)

ν•­λͺ© κ°’
🌐 포털 πŸ‘‰ Opinet μ˜€ν”Όλ„· API μ‹ μ²­ νŽ˜μ΄μ§€
λ°œκΈ‰ 절차 무료 νšŒμ›κ°€μž… β†’ API μ‹ μ²­ β†’ μ¦‰μ‹œ λ°œκΈ‰
μ½”λ“œ 호좜 endpoint opinet.co.kr/api/avgAllPrice.do, lowTop10.do

πŸ’‘ Opinet은 곡곡데이터포털과 λ³„κ°œ ν¬ν„Έμž…λ‹ˆλ‹€.


🏫 학ꡐ (NEIS)

ν•­λͺ© κ°’
🌐 포털 πŸ‘‰ NEIS κ΅μœ‘μ •λ³΄ 개방 포털
λ°œκΈ‰ 절차 νšŒμ›κ°€μž… β†’ 인증킀 μ‹ μ²­ β†’ λ§ˆμ΄νŽ˜μ΄μ§€ "μ‹ μ²­ν˜„ν™©" μ—μ„œ 확인
μ½”λ“œ 호좜 endpoint open.neis.go.kr/hub/...

πŸ’‘ NEIS도 곡곡데이터포털과 λ³„κ°œ ν¬ν„Έμž…λ‹ˆλ‹€. 학ꡐλͺ…은 HA μ„€μ •μ—μ„œ μžλ™ κ²€μƒ‰λ©λ‹ˆλ‹€ (학ꡐλͺ…λ§Œ μž…λ ₯ν•˜λ©΄ dropdown ν‘œμ‹œ).


🚌 λŒ€μ€‘κ΅ν†΅ / μ„œμšΈλ²„μŠ€ / ν•œκ΅­ λ²„μŠ€ β€” 무엇을 κ³ λ₯ΌκΉŒ?

βœ… 라이브 검증 μ™„λ£Œ (2026-05-18): ν•œκ΅­ λ²„μŠ€λ‘œ μ„œμšΈ 신도림동.κ΅¬λ‘œμ—­(쀑)(ARS 17003) + κ²½κΈ° μ‹œν₯ μ€κ³„μš°λ―Έλ¦°λ”νΌμŠ€νŠΈ(ARS 25842) 두 μ •λ₯˜μž₯ λ™μ‹œ 등둝 β†’ λ…Έμ„ λ‹Ή 도착 sensor + μƒˆλ‘œκ³ μΉ¨ λ²„νŠΌ + ν™œμ„±ν™” μŠ€μœ„μΉ˜ 정상 λ™μž‘. λ„μ°©μ‹œκ°„ / μ°¨λŸ‰λ²ˆν˜Έ / ν˜„μž¬μ •λ₯˜μž₯ / λ…Έμ„  첫차·막차·배차간격 λͺ¨λ“  attribute 라이브 응닡 확인.

λ²„μŠ€/μ§€ν•˜μ²  κ΄€λ ¨ν•΄ 메뉴에 μ„Έ κ°€μ§€ ν•­λͺ©μ΄ λ³΄μž…λ‹ˆλ‹€. μ‹œλ‚˜λ¦¬μ˜€λ³„ 정리:

메뉴 데이터 μ†ŒμŠ€ API ν‚€ νŠΉμ§• μΆ”μ²œ μ‚¬μš©μž
🚌 λŒ€μ€‘κ΅ν†΅ (μ§€ν•˜μ²  / λ²„μŠ€) μ„œμšΈ 열린데이터광μž₯ (μ§€ν•˜μ² ) + 카카였맡 (λ²„μŠ€) μ§€ν•˜μ² μ€ βœ…, λ²„μŠ€λŠ” ❌ ν•œ 톡합에 μ§€ν•˜μ² μ—­ + λ²„μŠ€μ •λ₯˜μž₯ ν˜Όν•© 등둝. ν™˜μŠΉκ²½λ‘œ μ˜΅μ…˜ 킀도 지원 μ§€ν•˜μ² Β·λ²„μŠ€ λͺ¨λ‘ μ“°λŠ” μ„œμšΈ/μˆ˜λ„κΆŒ μ‚¬μš©μž
🚌 μ„œμšΈλ²„μŠ€ (곡식 API) μ„œμšΈνŠΉλ³„μ‹œ μ •λ₯˜μ†Œμ •λ³΄μ‘°νšŒ API (ws.bus.go.kr) βœ… data.go.kr 곡식 API 기반 κ°€μž₯ μ •ν™•. ARS-ID μž…λ ₯ β†’ μžλ™μœΌλ‘œ λ…Έμ„  λͺ©λ‘ 쑰회. μ •λ₯˜μž₯λ‹Ή μƒˆλ‘œκ³ μΉ¨ λ²„νŠΌ + μ˜΅μ…˜μ—μ„œ μ •λ₯˜μž₯ μΆ”κ°€/제거/λ…Έμ„  νŽΈμ§‘ μ„œμšΈλ§Œ λ‹€λ‹ˆκ³  곡식 API μ•ˆμ •μ„±μ„ μ›ν•˜λŠ” μ‚¬μš©μž
🚍 ν•œκ΅­ λ²„μŠ€ (μ „κ΅­) 카카였맡 λͺ¨λ°”일 ❌ λΆˆν•„μš” μ •λ₯˜μž₯ 이름 검색 UI. μ „κ΅­ λŒ€λΆ€λΆ„ μ •λ₯˜μž₯. μ˜΅μ…˜μ—μ„œ 폴링 μ£ΌκΈ° λ³€κ²½ (30s~1h) ν‚€ λ°œκΈ‰μ΄ λΆ€λ‹΄μŠ€λŸ½κ±°λ‚˜, μ„œμšΈ μ™Έ μ§€μ—­ μ‚¬μš©μž

μ„œμšΈλ²„μŠ€ / ν•œκ΅­ λ²„μŠ€ β€” 무엇이 λ‹€λ₯Έκ°€?

  • 같은 μ •λ₯˜μž₯이라도 데이터 μ†ŒμŠ€κ°€ λ‹€λ₯΄λ©΄ 응닡이 μ•½κ°„ λ‹€λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€ (예: "κ³§ 도착" vs "1λΆ„ ν›„"). μ„œμšΈλ²„μŠ€λŠ” 곡식 API라 κ°€μž₯ μ •ν™•, ν•œκ΅­ λ²„μŠ€λŠ” 카카였맡 λͺ¨λ°”일 μ‚¬μ΄νŠΈλΌ μ‚¬μ΄νŠΈ 개편 μ‹œ μΌμ‹œ 깨질 μœ„ν—˜.
  • 두 톡합을 λ™μ‹œμ— 등둝해도 무방 (μ„œλ‘œ 독립). λΉ„κ΅μš©μœΌλ‘œ μ“°μ‹œλŠ” 뢄도 μžˆμŠ΅λ‹ˆλ‹€.

카카였맡 μ •λ₯˜μž₯ ID μ°ΎλŠ” 법 ("λŒ€μ€‘κ΅ν†΅" λ©”λ‰΄μ˜ λ²„μŠ€ 등둝 μ‹œ. "ν•œκ΅­ λ²„μŠ€"λŠ” 이름 검색이라 ID λΆˆν•„μš”): 카카였맡 β†’ μ •λ₯˜μž₯ 검색 β†’ μ •λ₯˜μž₯ 클릭 β†’ URL ?busstopid=03171&... β†’ busstopid= λ’€μ˜ κ°’ 볡사 (예: 03171, BS09013700).

μ„œμšΈλ²„μŠ€ ARS-ID μ°ΎλŠ” 법 ("μ„œμšΈλ²„μŠ€" 메뉴 등둝 μ‹œ): bus.go.kr λ˜λŠ” μ •λ₯˜μž₯ ν‘œμ§€νŒμ— 적힌 5자리 μ •λ₯˜μ†Œλ²ˆν˜Έ (예: 23288 = 사당역).


🚌 μ„œμšΈλ²„μŠ€ β€” API ν‚€ λ°œκΈ‰ κ°€μ΄λ“œ (5λΆ„)

ν•­λͺ© κ°’
🌐 포털 곡곡데이터포털 (data.go.kr)
πŸ”Ž λ°”λ‘œ 검색 πŸ‘‰ μ„œμšΈνŠΉλ³„μ‹œ_μ •λ₯˜μ†Œμ •λ³΄μ‘°νšŒ μ„œλΉ„μŠ€
μš΄μ˜κΈ°κ΄€ μ„œμšΈνŠΉλ³„μ‹œ
데이터셋λͺ… μ„œμšΈνŠΉλ³„μ‹œ_μ •λ₯˜μ†Œμ •λ³΄μ‘°νšŒ μ„œλΉ„μŠ€
μ½”λ“œ 호좜 endpoint ws.bus.go.kr/api/rest/stationinfo/getStationByUid
일일 호좜 ν•œλ„ 1,000회 (μΆ©λΆ„ β€” 1λΆ„ 폴링이면 1,440/일 μ΄μ§€λ§Œ ν™œμ„±ν™” μŠ€μœ„μΉ˜λ‘œ μ œμ–΄)

μ‹ μ²­ 단계:

  1. data.go.kr νšŒμ›κ°€μž… β†’ μœ„ "πŸ‘‰ λ°”λ‘œ 검색" 링크 클릭
  2. 상세 νŽ˜μ΄μ§€ β†’ ν™œμš©μ‹ μ²­ λ²„νŠΌ β†’ 폼 μž‘μ„± (μžλ™μŠΉμΈ dataset이라 별도 IP 등둝 λΆˆν•„μš”)
  3. λ§ˆμ΄νŽ˜μ΄μ§€ β†’ μ˜€ν”ˆAPI β†’ 인증킀 λ°œκΈ‰ν˜„ν™© β†’ 일반 인증킀 κ°’ 볡사

⚠️ μ€‘μš” β€” ν‚€ ν™œμ„±ν™”μ— μ•½ 24μ‹œκ°„ μ†Œμš”λ©λ‹ˆλ‹€.

λ§ˆμ΄νŽ˜μ΄μ§€μ— "μ²˜λ¦¬μƒνƒœ: 승인" + "ν™œμš©κΈ°κ°„: μ˜€λŠ˜λΆ€ν„°" 둜 ν‘œμ‹œλ˜μ–΄λ„, μ‹€μ œ API gateway 의 인증λͺ¨λ“ˆμ— ν‚€κ°€ λ“±λ‘λ˜κΈ°κΉŒμ§€ μ•½ 24μ‹œκ°„ μΆ”κ°€ λŒ€κΈ°κ°€ ν•„μš”ν•©λ‹ˆλ‹€. λ°œκΈ‰ 직후 HA 톡합 μΆ”κ°€ μ‹œ "API ν‚€κ°€ μœ νš¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€" λ©”μ‹œμ§€κ°€ λ‚˜μ™€λ„ 정상이며, λ‹€μŒλ‚  같은 μ‹œκ° μž¬μ‹œλ„ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

24μ‹œκ°„ 후에도 같은 μ—λŸ¬λ©΄:

  • ν™œμš©μ‹ μ²­ 데이터셋 이름이 μ •ν™•νžˆ "μ„œμšΈνŠΉλ³„μ‹œ_μ •λ₯˜μ†Œμ •λ³΄μ‘°νšŒ μ„œλΉ„μŠ€" 인지 μž¬ν™•μΈ (λΉ„μŠ·ν•œ μ΄λ¦„μ˜ λ‹€λ₯Έ dataset이 있음)
  • data.go.kr 고객센터 1566-0025 문의
  • λ˜λŠ” λ§ˆμ΄νŽ˜μ΄μ§€μ—μ„œ ν™œμš©μ‹ μ²­ ν•΄μ œ β†’ μž¬μ‹ μ²­

πŸ”Œ ν™œμ„±ν™” μŠ€μœ„μΉ˜ β€” μ„œμšΈλ²„μŠ€ / ν•œκ΅­ λ²„μŠ€ 곡톡 μ‹ κ·œ κΈ°λŠ₯

두 톡합 λͺ¨λ‘ μ •λ₯˜μž₯λ§ˆλ‹€ switch.<flow>_<id>_update_active μŠ€μœ„μΉ˜κ°€ μžλ™ μƒμ„±λ©λ‹ˆλ‹€. ON 일 λ•Œλ§Œ APIλ₯Ό ν˜ΈμΆœν•˜κ³ , OFF 일 λ•ŒλŠ” 직전 데이터λ₯Ό κ·ΈλŒ€λ‘œ μœ μ§€ν•˜λ©΄μ„œ ν˜ΈμΆœμ„ κ±΄λ„ˆλœλ‹ˆλ‹€.

μ™œ 이게 μœ μš©ν•œκ°€?

  • API 호좜 ν•œλ„ 절감 (특히 μ„œμšΈλ²„μŠ€ 1,000/일 ν•œλ„)
  • μƒˆλ²½ λ˜λŠ” μ™ΈμΆœ 쀑일 λ•Œ ꡳ이 폴링 μ•ˆ 함
  • HA μžλ™ν™”λ‘œ "ν•„μš”ν•  λ•Œλ§Œ" μ •λ°€ μ œμ–΄

default λ™μž‘:

  • μ‹ κ·œ μ„€μΉ˜ β†’ ON 으둜 μ‹œμž‘ (데이터 μ¦‰μ‹œ λ³΄μž„)
  • μž¬μ‹œμž‘ μ‹œ β†’ λ§ˆμ§€λ§‰ ON/OFF μƒνƒœ μžλ™ 볡원

μžλ™ν™” μ˜ˆμ‹œ β€” μΆœν‡΄κ·Ό μ‹œκ°„ + 거리 쑰건만 폴링:

alias: μΆœν‡΄κ·Ό λ²„μŠ€ 도착정보 폴링 μ œμ–΄
mode: restart
triggers:
  - at: "06:30:00"          # 좜근 μ‹œκ°„
    id: morning_on_time
    trigger: time
  - entity_id: sensor.<μ§‘-μ •λ₯˜μž₯-거리>   # 거리 sensor (proximity λ˜λŠ” template)
    above: 1000
    id: morning_off_dist
    trigger: numeric_state
  - at: "17:30:00"          # 퇴근 μ‹œκ°„
    id: evening_on_time
    trigger: time
  - entity_id: sensor.<μ§‘-μ •λ₯˜μž₯-거리>
    below: 200
    id: evening_off_dist
    trigger: numeric_state
actions:
  - choose:
      # μΆœκ·Όμ‹œκ°„ + 평일 + μ§‘ 근처 β†’ ON
      - conditions:
          - condition: trigger
            id: morning_on_time
          - condition: state
            entity_id: binary_sensor.workday_sensor
            state: "on"
          - condition: numeric_state
            entity_id: sensor.<μ§‘-μ •λ₯˜μž₯-거리>
            below: 200
        sequence:
          - service: switch.turn_on
            target:
              entity_id: switch.seoul_bus_*****_update_active
      # 좜근 ν›„ λ©€μ–΄μ§€λ©΄ β†’ OFF
      - conditions:
          - condition: trigger
            id: morning_off_dist
        sequence:
          - service: switch.turn_off
            target:
              entity_id: switch.seoul_bus_*****_update_active
      # ν‡΄κ·Όμ‹œκ°„ + νšŒμ‚¬ 근처 β†’ ON
      - conditions:
          - condition: trigger
            id: evening_on_time
        sequence:
          - service: switch.turn_on
            target:
              entity_id: switch.seoul_bus_*****_update_active
      # μ§‘ 도착 β†’ OFF
      - conditions:
          - condition: trigger
            id: evening_off_dist
        sequence:
          - service: switch.turn_off
            target:
              entity_id: switch.seoul_bus_*****_update_active

β†’ ν‰μ†Œμ—” API 호좜 0회, 좜근/퇴근 μ‹œκ°„μ—λ§Œ 폴링.

λŒ€μ‹œλ³΄λ“œ 쑰건뢀 ν‘œμ‹œ (HACS state-switch μΉ΄λ“œ μΆ”μ²œ):

type: custom:state-switch
entity: switch.seoul_bus_*****_update_active
states:
  on:
    type: entities
    entities:
      - sensor.seoul_bus_*****_*****_now
      - sensor.seoul_bus_*****_*****_next
      - button.seoul_bus_*****_refresh
  off:
    type: custom:button-card
    color_type: blank-card    # μŠ€μœ„μΉ˜ OFFλ©΄ μΉ΄λ“œ 자체 μ•ˆ λ³΄μž„

βš™οΈ μ •λ₯˜μž₯ 관리 (μ„œμšΈλ²„μŠ€ / ν•œκ΅­ λ²„μŠ€ 곡톡)

톡합 μΆ”κ°€ ν›„ μ •λ₯˜μž₯을 더 μΆ”κ°€ν•˜κ±°λ‚˜ 노선을 νŽΈμ§‘ν•˜λ €λ©΄ μ‚­μ œΒ·μž¬λ“±λ‘ ν•„μš” μ—†μŠ΅λ‹ˆλ‹€:

μ„€μ • β†’ κΈ°κΈ° 및 μ„œλΉ„μŠ€ β†’ "ν•œκ΅­ μ»΄ν¬λ„ŒνŠΈ ν‚€νŠΈ" μΉ΄λ“œ β†’ "ꡬ성" λ²„νŠΌ β†’ 메뉴 λ“±μž₯:

메뉴 λ™μž‘
🚏 μ •λ₯˜μž₯ μΆ”κ°€ μƒˆ μ •λ₯˜μž₯ 등둝 (μ„œμšΈ: ARS-ID μž…λ ₯ / ν•œκ΅­ λ²„μŠ€: 이름 검색)
πŸ—‘ μ •λ₯˜μž₯ μ‚­μ œ 볡수 선택 κ°€λŠ₯
🚌 μ •λ₯˜μž₯ λ…Έμ„  νŽΈμ§‘ κΈ°μ‘΄ μ •λ₯˜μž₯μ—μ„œ 좔적할 λ…Έμ„  λ³€κ²½
πŸ”‘ API ν‚€ λ³€κ²½ (μ„œμšΈλ²„μŠ€λ§Œ) μƒˆ ν‚€ μž…λ ₯ μ‹œ μ €μž₯ 직전 μžλ™ 검증
⏱ 폴링 μ£ΌκΈ° λ³€κ²½ (ν•œκ΅­ λ²„μŠ€λ§Œ) 30초 ~ 1μ‹œκ°„
βœ… μ €μž₯ ν›„ μ’…λ£Œ λ³€κ²½ 사항 일괄 μ €μž₯ + μžλ™ reload

X λ‹«κΈ° μ‹œ λ³€κ²½ 사항 무효 (transactional νŒ¨ν„΄).


🎁 λΈ”λ£¨ν”„λ¦°νŠΈ 8μ’… β€” ν•œ 번 import 둜 μžλ™ν™” μ™„μ„±

μ„œμšΈλ²„μŠ€ ↔ ν•œκ΅­ λ²„μŠ€ ν˜Έν™˜μ„±

λΈ”λ£¨ν”„λ¦°νŠΈ 🚌 μ„œμšΈλ²„μŠ€ 🚍 ν•œκ΅­ λ²„μŠ€
좜발 μ•ŒλžŒ βœ… βœ…
ν•˜μ°¨ μ•ŒλžŒ βœ… βœ…
막차 μ•ŒλžŒ βœ… βœ…
만차 / 혼작 μ•ŒλžŒ βœ… ❌ (카카였맡 응닡에 만차 ν•„λ“œ μ—†μŒ)
μ •λ₯˜μž₯ 근처 μžλ™ ν™œμ„±ν™” (μœ„μΉ˜ 기반) βœ… βœ…
μ§‘ λ– λ‚  λ•Œ μ•Œλ¦Ό (μœ„μΉ˜ 기반) βœ… βœ…
λͺ©μ μ§€ 도착 ν•˜μ°¨ μ•ŒλžŒ (μœ„μΉ˜ 기반) βœ… βœ…
μΆœν‡΄κ·Ό μžλ™ λͺ¨λ“œ (μœ„μΉ˜ 기반) βœ… βœ…

β†’ 8개 쀑 7κ°œκ°€ μ–‘μͺ½ λͺ¨λ‘ λ™μž‘. ν•œκ΅­ λ²„μŠ€ μ‚¬μš©μžλ„ 95%의 μžλ™ν™” κ°€μΉ˜λ₯Ό κ·ΈλŒ€λ‘œ λˆ„λ¦΄ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ•Œλ¦Ό μ•‘μ…˜ μž…λ ₯ β€” action selector

λͺ¨λ“  λΈ”λ£¨ν”„λ¦°νŠΈμ˜ "μ•Œλ¦Ό μ•‘μ…˜" μž…λ ₯은 HA action selector μž…λ‹ˆλ‹€. import μ‹œ UIμ—μ„œ:

  • service λ“œλ‘­λ‹€μš΄μ—μ„œ notify.mobile_app_my_phone 같이 본인의 notify μ„œλΉ„μŠ€ 선택
  • title / message λŠ” default 둜 {{ alert_title }} / {{ alert_message }} template κ°€ λ“€μ–΄κ°€ μžˆμ–΄μš” β€” λΈ”λ£¨ν”„λ¦°νŠΈ λ‚΄λΆ€ λ³€μˆ˜κ°€ μ•Œμ•„μ„œ μ±„μ›Œ μ€λ‹ˆλ‹€
  • μ›ν•˜μ‹œλ©΄ λ‹€λ₯Έ μ•Œλ¦Ό μ„œλΉ„μŠ€(예: notify.telegram, media_player.tts.google_say λ“±)λ‘œλ„ 자유둭게 λ³€κ²½ κ°€λŠ₯

곡곡데이터 ν™œμš©μ‚¬λ‘€ λΉˆλ„μˆœ νŒ¨ν„΄λ“€μ„ HA λΈ”λ£¨ν”„λ¦°νŠΈ 둜 μ œκ³΅ν•©λ‹ˆλ‹€.

λΈ”λ£¨ν”„λ¦°νŠΈ 트리거 μš©λ„
🚌 좜발 μ•ŒλžŒ native_value (TIMESTAMP) κ°€ NλΆ„ 이내 μ§„μž… μ •λ₯˜μž₯κΉŒμ§€ 도보 NλΆ„ β†’ "μ§€κΈˆ μΆœλ°œν•˜μ„Έμš”" ν‘Έμ‹œ
πŸ”” ν•˜μ°¨ μ•ŒλžŒ sensor 의 current_stop attribute κ°€ λ³€κ²½ νƒ‘μŠΉ 쀑 μ§€μ • μ •λ₯˜μž₯ N개 μ „ 도달 μ‹œ ν‘Έμ‹œ ("내릴 μ •κ±°μž₯μž…λ‹ˆλ‹€")
πŸŒ™ 막차 μ•ŒλžŒ last_vehicle / is_last attribute 막차 μš΄ν–‰ μ‹œ ν‘Έμ‹œ ("이번 μ°¨κ°€ λ§‰μ°¨μž…λ‹ˆλ‹€")
🚨 만차 / 혼작 μ•ŒλžŒ 만차 binary_sensor ON + congestion λ³€ν™” 만차 μ‹œ λ‹€μŒ μ°¨ λ„μ°©μ‹œκ°„ ν‘Έμ‹œ (μ„œμšΈλ²„μŠ€ μ „μš©)

Import 방법 (UI ν•œ λ²ˆμ—):

  1. HA β†’ μ„€μ • β†’ μžλ™ν™” β†’ λΈ”λ£¨ν”„λ¦°νŠΈ β†’ λΈ”λ£¨ν”„λ¦°νŠΈ κ°€μ Έμ˜€κΈ°
  2. μ•„λž˜ URL 쀑 μ›ν•˜λŠ” μžλ™ν™” URL λΆ™μ—¬λ„£κΈ° β†’ 미리보기 β†’ λΈ”λ£¨ν”„λ¦°νŠΈ κ°€μ Έμ˜€κΈ°
좜발 μ•ŒλžŒ: https://github.com/redchupa/kr_component_kit/blob/main/blueprints/automation/kr_component_kit/bus_departure_alert.yaml
ν•˜μ°¨ μ•ŒλžŒ: https://github.com/redchupa/kr_component_kit/blob/main/blueprints/automation/kr_component_kit/bus_alight_alert.yaml
막차 μ•ŒλžŒ: https://github.com/redchupa/kr_component_kit/blob/main/blueprints/automation/kr_component_kit/bus_lastride_alert.yaml
만차/혼작 μ•ŒλžŒ: https://github.com/redchupa/kr_component_kit/blob/main/blueprints/automation/kr_component_kit/bus_crowded_alert.yaml
  1. μžλ™ν™” λ§Œλ“€κΈ° β†’ λΈ”λ£¨ν”„λ¦°νŠΈ 선택 β†’ sensor + λ””λ°”μ΄μŠ€ + λΆ„ λ“± μž…λ ₯ β†’ μ €μž₯

πŸ’‘ λͺ¨λ°”일 ν‘Έμ‹œλŠ” HA Companion App (iOS / Android) κ°€ μ„€μΉ˜λœ λ””λ°”μ΄μŠ€μ˜ notify.mobile_app_<폰_이름> μ„œλΉ„μŠ€λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 폰 이름은 μ„€μ • β†’ λ””λ°”μ΄μŠ€ β†’ Companion App 등둝 μ‹œ ν‘œμ‹œλœ 이름.

ν™œμš©μ‚¬λ‘€:

  • πŸŒƒ μ•Όκ°„ μ™ΈμΆœ ν›„ 막차 μ•ŒλžŒ β†’ λ†“μΉ˜λ©΄ νƒμ‹œ
  • 🚌 μΆœν‡΄κ·Ό μ‹œ 만차 μ•ŒλžŒ β†’ λ‹€μŒ μ°¨ κΈ°λ‹€λ¦¬κ±°λ‚˜ λ‹€λ₯Έ λ…Έμ„  이용
  • πŸ› 좜근 μ‹œ 좜발 μ•ŒλžŒ β†’ μ •λ₯˜μž₯κΉŒμ§€ 도보 + μ‹ ν˜Έ λŒ€κΈ° κ³ λ €ν•΄μ„œ μ•ŒλžŒ 5λΆ„ μ „

πŸ“± μœ„μΉ˜ 기반 λΈ”λ£¨ν”„λ¦°νŠΈ 4μ’… β€” HA Companion App ν•Έλ“œν° 좔적 ν™œμš©

HA Companion App 으둜 μΆ”μ λ˜λŠ” 본인 폰의 device_tracker μœ„μΉ˜λ₯Ό ν™œμš©ν•œ μžλ™ν™”. 일반 λ²„μŠ€μ•±μ΄ λͺ» ν•˜λŠ” HA + 폰 μœ„μΉ˜μ˜ 강점.

λΈ”λ£¨ν”„λ¦°νŠΈ λ™μž‘
🚏 μ •λ₯˜μž₯ 근처 μžλ™ ν™œμ„±ν™” 폰이 μ •λ₯˜μž₯ zone μ§„μž… β†’ ν™œμ„±ν™” μŠ€μœ„μΉ˜ ON, λ– λ‚˜λ©΄ NλΆ„ ν›„ OFF
🏠 μ§‘ λ– λ‚  λ•Œ λ²„μŠ€ μ‹œκ°„ μ•Œλ¦Ό zone.home λ– λ‚˜λŠ” μˆœκ°„ λ‹€μŒ λ²„μŠ€ 도착 μ‹œκ°„ ν‘Έμ‹œ
πŸ“ λͺ©μ μ§€ 도착 μ‹œ ν•˜μ°¨ μ•ŒλžŒ 폰이 λͺ©μ μ§€ zone μ§„μž… β†’ ν‘Έμ‹œ ("내릴 μ •κ±°μž₯ 도착") β€” λ²„μŠ€μ—μ„œ μž λ“€μ–΄λ„ μœ„μΉ˜λ‘œ 깨움
🌍 μΆœν‡΄κ·Ό μžλ™ λͺ¨λ“œ μ‹œκ°„ + μœ„μΉ˜ β†’ ν™œμ„±ν™” μŠ€μœ„μΉ˜ μžλ™ ON/OFF (원본 개발자 μžλ™ν™” νŒ¨ν„΄)

μ„ ν–‰ 단계 β€” μ •λ₯˜μž₯ / νšŒμ‚¬ zone λ§Œλ“€κΈ°:

  1. HA β†’ μ„€μ • β†’ μ˜μ—­(Zone) β†’ μΆ”κ°€
  2. μ •λ₯˜μž₯ μ’Œν‘œ μž…λ ₯ (카카였맡 β†’ μ •λ₯˜μž₯ 클릭 β†’ μœ„κ²½λ„ 확인)
  3. 반경: μ •λ₯˜μž₯ zone은 100~200m, νšŒμ‚¬/학ꡐ zone은 200~300m ꢌμž₯

Import URL:

μ •λ₯˜μž₯ 근처 μžλ™ ν™œμ„±ν™”: https://github.com/redchupa/kr_component_kit/blob/main/blueprints/automation/kr_component_kit/stop_proximity_toggle.yaml
μ§‘ λ– λ‚  λ•Œ λ²„μŠ€ μ•Œλ¦Ό:    https://github.com/redchupa/kr_component_kit/blob/main/blueprints/automation/kr_component_kit/leaving_home_alert.yaml
λͺ©μ μ§€ 도착 ν•˜μ°¨ μ•ŒλžŒ:  https://github.com/redchupa/kr_component_kit/blob/main/blueprints/automation/kr_component_kit/arrival_alight_alert.yaml
μΆœν‡΄κ·Ό μžλ™ λͺ¨λ“œ:        https://github.com/redchupa/kr_component_kit/blob/main/blueprints/automation/kr_component_kit/commute_auto_mode.yaml

μœ„μΉ˜ 기반 μžλ™ν™” μ‘°ν•© μ˜ˆμ‹œ:

  • "μ •λ₯˜μž₯ 근처 μžλ™ ν™œμ„±ν™”" + "μ§‘ λ– λ‚  λ•Œ μ•Œλ¦Ό" = μ™ΈμΆœ μ‹œ μ•Œμ•„μ„œ 폴링 + λ‹€μŒ λ²„μŠ€ μ•ˆλ‚΄
  • "λͺ©μ μ§€ 도착 ν•˜μ°¨ μ•ŒλžŒ" = λ²„μŠ€μ—μ„œ μž λ“€μ–΄λ„ μ•ˆμ „
  • "μΆœν‡΄κ·Ό μžλ™ λͺ¨λ“œ" = 평일 μΆœν‡΄κ·Όλ§Œ μ •ν™•νžˆ 폴링, 주말/μ™ΈμΆœ μ‹œ μžλ™ OFF (API 호좜 ν•œλ„ 절감)

βš™οΈ λ“±λ‘Β·μž¬μ„€μ • 흐름

μƒˆ ν•­λͺ© 등둝

μ„€μ • β†’ κΈ°κΈ° 및 μ„œλΉ„μŠ€ β†’ + 톡합 κ΅¬μ„±μš”μ†Œ μΆ”κ°€ β†’ ν•œκ΅­ μ»΄ν¬λ„ŒνŠΈ ν‚€νŠΈ 검색 β†’ μ›ν•˜λŠ” μ„œλΉ„μŠ€ 선택.

ν•œ 톡합에 13개 μ„œλΉ„μŠ€κ°€ λ©”λ‰΄λ‘œ λ“€μ–΄μžˆμ–΄, μΆ”κ°€ν•˜λ €λŠ” μ„œλΉ„μŠ€λ§ˆλ‹€ ν•œ λ²ˆμ”© λ“±λ‘ν•©λ‹ˆλ‹€. 같은 μ„œλΉ„μŠ€λ₯Ό μ—¬λŸ¬ μ§€μ—­μœΌλ‘œ 쀑볡 등둝도 κ°€λŠ₯ (예: 약ꡭ을 μ‹œν₯μ‹œΒ·μ•ˆμ–‘μ‹œΒ·λΆ€λͺ¨λ‹˜ 댁 μ‹œκ΅°κ΅¬ 3번 등둝).

등둝 ν›„ λ³€κ²½ (API ν‚€ κ°±μ‹  / μ§€μ—­ μΆ”κ°€ λ“±)

ν•΄λ‹Ή ν•­λͺ© μ˜† "ꡬ성" λ²„νŠΌ β†’ μž…λ ₯κ°’ νŽΈμ§‘. (μ‚­μ œΒ·μž¬λ“±λ‘ 없이 κ°€λŠ₯. entity와 μžλ™ν™” μ—°κ²° μœ μ§€λ¨.)

μž…λ ₯κ°’ μ–΄λ””μ„œ λ°›λŠ”κ°€?

μ„œλΉ„μŠ€ μ–΄λ””μ„œ λ°›λŠ”κ°€
⚑ KEPCO ν•œμ „ ν™ˆνŽ˜μ΄μ§€ ID/λΉ„λ°€λ²ˆν˜Έ (본인 계정, 2μ°¨ 인증 미지원)
πŸ’§ μ•„λ¦¬μˆ˜ 쒅이 κ³ μ§€μ„œ λ˜λŠ” μ•„λ¦¬μˆ˜ 사이버 고객센터 β†’ μš”κΈˆμ‘°νšŒ 쒌츑 μˆ˜μš©κ°€λ²ˆν˜Έ + 고객λͺ…
🏠 κ°€μŠ€μ•± μ‚¬μš©κ³„μ•½λ²ˆν˜ΈλŠ” κ°€μŠ€μ•± λͺ¨λ°”일 μ•± β†’ λ‚΄ 정보. ν† ν°Β·νšŒμ›IDλŠ” mitmproxy λ“±μœΌλ‘œ λͺ¨λ°”일 μ•± HTTPS μš”μ²­μ˜ X-Token/X-Member 헀더 μΆ”μΆœ (⚠️ κ³ κΈ‰ μ‚¬μš©μžμš©)
🌍 μ§€μ§„ μ’Œν‘œ 기본값은 μ„œμšΈμ‹œμ²­ (37.5665, 126.978). 본인 μ§‘ μ’Œν‘œλ‘œ κΌ­ λ³€κ²½. κΈ°λ³Έ 반경 200km / μ΅œμ†Œ 규λͺ¨ 3.0

🎁 λ“±λ‘ν•˜λ©΄ λ§Œλ“€μ–΄μ§€λŠ” entity

entity_idλŠ” ν•œκ΅­μ–΄ β†’ 둜마자 슬러그 μžλ™ λ³€ν™˜ (예: μ•½κ΅­ - μ‹œν₯μ‹œ + 운영 μ•½κ΅­ 수 β†’ sensor.yaggug_siheungsi_unyeong_yaggug_su). μ •ν™•ν•œ IDλŠ” 개발자 도ꡬ β†’ μƒνƒœ μ—μ„œ μΉœν™” μ΄λ¦„μœΌλ‘œ 검색해 확인.

μ„œλΉ„μŠ€ μΉœν™” 이름 (sensor λ“±) μ£Όμš” attribute
πŸ’Š μ•½κ΅­ 운영 μ•½κ΅­ 수 pharmacies[] (μ΅œλŒ€ 50: nameΒ·addressΒ·phoneΒ·latΒ·lonΒ·today_hoursΒ·open_nowΒ·duty_time), total, shown, open_now_count
🚨 μ•ˆμ „μ•Œλ¦Ό μ΅œμ‹  μ•ˆμ „μ•Œλ¦Ό, μ•ˆμ „μ•Œλ¦Ό 수, 였늘 μ•ˆμ „μ•Œλ¦Ό μ—¬λΆ€ (binary), μ•ˆμ „μ•Œλ¦Ό 이벀트 (event) latest, alerts[], count
πŸ“’ μž¬λ‚œλ¬Έμž μ΅œμ‹  μž¬λ‚œλ¬Έμž, μž¬λ‚œλ¬Έμž 수, μž¬λ‚œλ¬Έμž 이벀트 (event) level, area, disaster_type
πŸŒͺ️ κΈ°μƒνŠΉλ³΄ 호우 특보/강풍 특보/ν•œνŒŒ 특보/... (event 12μ’…) state: advisory/warning/pre_*/cancelled/none, start_time, end_time
🌍 μ§€μ§„ μ§€μ§„ 경보 (event) magnitude, location, distance_km, datetime
β›… λ™λ„€μ˜ˆλ³΄ (weather μ—”ν‹°ν‹° 1개 β€” HA κΈ°λ³Έ Weather μΉ΄λ“œ ν˜Έν™˜) hourly/daily forecast μ„œλΉ„μŠ€ 지원
🌫️ 에어코리아 PM10 λ―Έμ„Έλ¨Όμ§€, PM2.5 μ΄ˆλ―Έμ„Έλ¨Όμ§€, O₃ 였쑴, NOβ‚‚ μ΄μ‚°ν™”μ§ˆμ†Œ, SOβ‚‚ μ•„ν™©μ‚°κ°€μŠ€, CO μΌμ‚°ν™”νƒ„μ†Œ, ν†΅ν•©λŒ€κΈ°μ§ˆμ§€μˆ˜ + binary λŒ€κΈ°μ§ˆ 경보 + event + calendar λŒ€κΈ°μ§ˆ 예보 λ“±κΈ‰(Grade) λ™λ°˜
⚑ KEPCO ν˜„μž¬ μ‚¬μš©λŸ‰ (kWh), μ§€λ‚œλ‹¬ μš”κΈˆ (원), μ˜ˆμƒ μš”κΈˆ (원), 고객번호, μ „λ ₯ꡬ뢄 β€”
πŸ’§ μ•„λ¦¬μˆ˜ μˆ˜λ„ μš”κΈˆ (원), μ‚¬μš©λŸ‰ (γŽ₯), 청ꡬ월 billing_month, customer_info, arrears_info
🏠 κ°€μŠ€μ•± 청ꡬ 제λͺ©, 총 μš”κΈˆ (원) β€”
β›½ μœ κ°€ μ „κ΅­ 평균가, μ΅œμ €κ°€ (λ“±λ‘ν•œ μ‹œλ„Γ—μœ μ’… μ‘°ν•©λ§ˆλ‹€) ranking[] (Top 5 μ£Όμœ μ†Œ μ΄λ¦„Β·κ°€κ²©Β·μ£Όμ†Œ)
🏫 학ꡐ 급식, 학ꡐ 정보 + calendar 학사일정/μ‹œκ°„ν‘œ 급식: menu, calorie, allergy_codes
🚌 λŒ€μ€‘κ΅ν†΅ <μ—­/μ •λ₯˜μž₯> ... 도착 (TIMESTAMP β€” HAκ°€ "NλΆ„ ν›„"둜 μžλ™ ν‘œμ‹œ) β€”
🚌 μ„œμšΈλ²„μŠ€ λ…Έμ„ λ‹Ή: 도착 sensor 2개 (λ‹€μŒ/λ‹€λ‹€μŒ, TIMESTAMP) + μ €μƒλ²„μŠ€ binary_sensor + 만차 binary_sensor. μ •λ₯˜μž₯λ‹Ή: μƒˆλ‘œκ³ μΉ¨ λ²„νŠΌ + μ—…λ°μ΄νŠΈ ν™œμ„±ν™” μŠ€μœ„μΉ˜ vehicle_no, current_stop, message, is_full, is_low_floor, bus_type (일반/저상/꡴절), congestion (μ—¬μœ /보톡/혼작), passengers_aboard, remaining_seats, direction, status
🚍 ν•œκ΅­ λ²„μŠ€ λ…Έμ„ λ‹Ή: 도착 sensor 2개. μ •λ₯˜μž₯λ‹Ή: μƒˆλ‘œκ³ μΉ¨ λ²„νŠΌ + μ—…λ°μ΄νŠΈ ν™œμ„±ν™” μŠ€μœ„μΉ˜ vehicle_number, current_stop, message, remain_seat, next_stop, first_time/last_time/intervals, bus_type, status

🎨 λŒ€μ‹œλ³΄λ“œ 예제 β€” μ•½κ΅­ κ°€κΉŒμš΄ 순 + μ˜μ—…μ€‘ ν•„ν„° + 카카였맡 κΈΈμ°ΎκΈ°

검색·필터 헬퍼 두 개 λ¨Όμ €:

  • μ„€μ • β†’ 헬퍼 β†’ ν…μŠ€νŠΈ: input_text.yaggug_geomsaeg ("μ•½κ΅­ 검색")
  • μ„€μ • β†’ 헬퍼 β†’ ν† κΈ€: input_boolean.yaggug_yeongeobjungman ("μ•½κ΅­ μ˜μ—…μ€‘λ§Œ")

λŒ€μ‹œλ³΄λ“œ YAML (μ„Ήμ…˜/vertical-stack에 ν†΅μ§Έλ‘œ λΆ™μ—¬λ„£κΈ°. 본인 μ•½κ΅­ entity_id둜 λ³€κ²½):

type: vertical-stack
cards:
  - type: heading
    heading: πŸ’Š 운영 μ•½κ΅­
    heading_style: title
    icon: mdi:pharmacy

  - type: horizontal-stack
    cards:
      - type: tile
        entity: sensor.yaggug_siheungsi_unyeong_yaggug_su  # 본인 entity_id
        name: 전체 μ•½κ΅­
        icon: mdi:pharmacy-marker
        color: green
      - type: tile
        entity: sensor.yaggug_siheungsi_unyeong_yaggug_su
        name: μ§€κΈˆ μ˜μ—… 쀑
        icon: mdi:clock-check
        color: blue
        state_content: open_now_count

  - type: entities
    title: 검색 / ν•„ν„°
    show_header_toggle: false
    entities:
      - entity: input_text.yaggug_geomsaeg
        name: πŸ” 이름 검색
      - entity: input_boolean.yaggug_yeongeobjungman
        name: 🟒 μ§€κΈˆ μ˜μ—… μ€‘λ§Œ

  - type: markdown
    title: μ•½κ΅­ λͺ©λ‘ (κ°€κΉŒμš΄ 순)
    content: |
      {% set tracker = 'zone.home' %}
      {% set sensor_id = 'sensor.yaggug_siheungsi_unyeong_yaggug_su' %}
      {% set my_lat = state_attr(tracker, 'latitude') | float(0) %}
      {% set my_lon = state_attr(tracker, 'longitude') | float(0) %}
      {% set ph = state_attr(sensor_id, 'pharmacies') or [] %}
      {% set raw_query = states('input_text.yaggug_geomsaeg') | default('', true) %}
      {% set query = '' if raw_query in ['unknown', 'unavailable', 'none', None] else raw_query | lower | trim %}
      {% set open_only = is_state('input_boolean.yaggug_yeongeobjungman', 'on') %}
      {% set step1 = ph if not query else ph | selectattr('name', 'search', query) | list %}
      {% set filtered = step1 | selectattr('open_now') | list if open_only else step1 %}
      {% set ns = namespace(items=[]) %}
      {% for p in filtered %}
        {% set d = distance(my_lat, my_lon, p.lat | float(0), p.lon | float(0)) %}
        {% set ns.items = ns.items + [(d, p)] %}
      {% endfor %}
      {% set ranked = ns.items | sort %}
      **ν‘œμ‹œ {{ ranked | length }}κ³³** Β· κΈ°μ€€ `{{ tracker }}`
      {% if query %}Β· 검색 `{{ query }}`{% endif %}{% if open_only %}Β· μ˜μ—…μ€‘λ§Œ{% endif %}

      ---
      {% for d, p in ranked[:15] %}
      {% set dist_label = ((d * 1000) | round(0) | int | string) + 'm' if d < 1 else ((d | round(1) | string) + 'km') %}
      ### {{ '🟒' if p.open_now else 'βšͺ' }} {{ p.name }} Β· _{{ dist_label }}_
      - πŸ“ {{ p.address }}
      - πŸ“ž [{{ p.phone or '번호 μ—†μŒ' }}](tel:{{ (p.phone or '') | replace('-','') }})
      - πŸ• {{ ('μ§€κΈˆ μ˜μ—… 쀑 (' + p.today_hours + ')') if p.open_now else (('였늘 ' + p.today_hours) if p.today_hours else '였늘 휴무') }}
      - πŸ—ΊοΈ [카카였맡](https://map.kakao.com/link/map/{{ p.name | urlencode }},{{ p.lat }},{{ p.lon }}) Β· [κΈΈμ°ΎκΈ°](https://map.kakao.com/link/to/{{ p.name | urlencode }},{{ p.lat }},{{ p.lon }})

      {% endfor %}

πŸ’‘ μœ„μΉ˜ 기쀀을 폰 λ”°λΌκ°€κ²Œ ν•˜λ €λ©΄ tracker = 'zone.home'을 person.<본인> λ˜λŠ” device_tracker.<폰> 으둜 λ³€κ²½.


πŸ€– μžμ—°μ–΄λ‘œ 묻기 (LLM μ˜΅μ…˜)

HA의 Assist + LLM 톡합 (OpenAI / Google / Ollama λ“±)에 λ³Έ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ…ΈμΆœν•˜λ©΄ ν•œκ΅­μ–΄λ‘œ 직접 물을 수 μžˆμŠ΅λ‹ˆλ‹€.

질문 λ§€μΉ­ μ„œλΉ„μŠ€
"μ§€κΈˆ μ˜μ—…μ€‘μΈ κ°€κΉŒμš΄ μ•½κ΅­ μ•Œλ €μ€˜" πŸ’Š μ•½κ΅­
"였늘 λ―Έμ„Έλ¨Όμ§€ μ–΄λ•Œ?" 🌫️ 에어코리아
"내일 λΉ„ 와?" β›… 기상청
"졜근 μž¬λ‚œλ¬Έμž 뭐 μžˆμ–΄?" πŸ“’ μž¬λ‚œλ¬Έμž
"였늘 급식 뭐야?" 🏫 학ꡐ
"λ‹€μŒ λ²„μŠ€ μ–Έμ œ 와?" 🚌 λŒ€μ€‘κ΅ν†΅

LLM에 λ…ΈμΆœ μ•ˆ 해도 일반 sensor/event/weather μ—”ν‹°ν‹°λ‘œ 정상 λ™μž‘. μΆ”κ°€ μ„€μ • λΆˆν•„μš”.


❓ FAQ

13κ°€μ§€λ₯Ό μ „λΆ€ 등둝해야 ν•˜λ‚˜μš”?

μ•„λ‹ˆμš”. μ›ν•˜λŠ” κ²ƒλ§Œ λ“±λ‘ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€. 등둝 μ•ˆ ν•œ μ„œλΉ„μŠ€λŠ” entityΒ·λ¦¬μ†ŒμŠ€λ₯Ό μ „ν˜€ μ“°μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ‚¬μš©λ£Œκ°€ λ“œλ‚˜μš”?

μ „λΆ€ 무료. 정뢀·곡곡기관 OpenAPIλ₯Ό μ‚¬μš©ν•˜λ©° λ³Έ μ»΄ν¬λ„ŒνŠΈλ„ 결제·과금 μ—†μŒ. 각 APIλŠ” 일일 호좜 ν•œλ„(보톡 1만~100만회/일)κ°€ μžˆμ§€λ§Œ κ°€μ •μš© 1인 μ‚¬μš©μœΌλ‘œ λ„˜κΈ°λŠ” 일은 거의 μ—†μŠ΅λ‹ˆλ‹€.

API ν‚€ 신청이 λΆ€λ‹΄μŠ€λŸ¬μ›Œμš”

ν‚€ 없이 λ°”λ‘œ λ˜λŠ” μ„œλΉ„μŠ€ 4κ°€μ§€λΆ€ν„° μ²΄ν—˜ν•˜μ„Έμš”:

  • 🚨 μ•ˆμ „μ•Œλ¦Ό β€” μ§€μ—­λ§Œ 선택 (ν–‰μ•ˆλΆ€ νŽ˜μ΄μ§€ μŠ€ν¬λž˜ν•‘)
  • ⚑ ν•œκ΅­μ „λ ₯ / πŸ’§ μ•„λ¦¬μˆ˜ / 🏠 κ°€μŠ€μ•± β€” 본인 계정/번호둜 둜그인 (API ν‚€ μ•„λ‹˜)
μ„œμšΈ μ™Έ κ±°μ£Όμžλ„ κ°€λŠ₯ν•œκ°€μš”?

λŒ€λΆ€λΆ„ μ „κ΅­ κ°€λŠ₯. μ„œμšΈ μ „μš©: μ•„λ¦¬μˆ˜(μƒμˆ˜λ„), μ„œμšΈ μ§€ν•˜μ²  μ‹€μ‹œκ°„ 도착정보. λ‚˜λ¨Έμ§€λŠ” μ „κ΅­ OK.

λ“±λ‘ν•œ API 킀·지역을 λ°”κΎΈλ €λ©΄?

μ„€μ • β†’ κΈ°κΈ° 및 μ„œλΉ„μŠ€ β†’ "ν•œκ΅­ μ»΄ν¬λ„ŒνŠΈ ν‚€νŠΈ" μΉ΄λ“œ β†’ ν•΄λ‹Ή ν•­λͺ©μ˜ "ꡬ성" λ²„νŠΌ. μ‚­μ œΒ·μž¬λ“±λ‘ 없이 entity와 μžλ™ν™” μ—°κ²° μœ μ§€λ¨.

같은 μ„œλΉ„μŠ€λ₯Ό μ—¬λŸ¬ μ§€μ—­μœΌλ‘œ 등둝 κ°€λŠ₯?

κ°€λŠ₯ν•©λ‹ˆλ‹€. μ•½κ΅­ μ„œλΉ„μŠ€λ₯Ό μ‹œν₯μ‹œΒ·μ•ˆμ–‘μ‹œΒ·λΆ€λͺ¨λ‹˜ 댁 3번 λ“±λ‘ν•˜λ©΄ 독립적인 κΈ°κΈ°Β·entity 3μ„ΈνŠΈκ°€ λ§Œλ“€μ–΄μ§‘λ‹ˆλ‹€.

ν•Έλ“œν° μ•Œλ¦Όκ³Ό ν•¨κ»˜ μ“°λ €λ©΄?

HA Automation + Companion μ•± ν‘Έμ‹œ μ‘°ν•©. κ°€μž₯ λ‹¨μˆœν•œ μ˜ˆμ‹œ:

automation:
  - alias: "μž¬λ‚œλ¬Έμž β†’ ν•Έλ“œν° ν‘Έμ‹œ"
    trigger:
      - platform: state
        entity_id: sensor.<μž¬λ‚œλ¬Έμž_μ΅œμ‹ _μ—”ν‹°ν‹°_id>   # 개발자 λ„κ΅¬μ—μ„œ 확인
    condition:
      - condition: template
        value_template: "{{ trigger.to_state.state not in ['μ—†μŒ', 'unknown', 'unavailable'] }}"
    action:
      - service: notify.mobile_app_<폰_이름>
        data:
          title: "🚨 μž¬λ‚œλ¬Έμž"
          message: "{{ trigger.to_state.state }}"
μž…λ ₯ν•œ λΉ„λ°€λ²ˆν˜ΈΒ·ν‚€λŠ” μ–΄λ”” μ €μž₯λ˜λ‚˜μš”?

Home Assistant λ‚΄λΆ€ μ €μž₯μ†Œ (.storage/) μ—λ§Œ μ €μž₯되며 μ™ΈλΆ€λ‘œ μ „μ†‘λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μž…λ ₯ν•œ λΉ„λ°€λ²ˆν˜ΈλŠ” API 호좜 μ‹œ ν•΄λ‹Ή μ„œλΉ„μŠ€(ν•œμ „Β·μ•„λ¦¬μˆ˜ λ“±)의 곡식 νŽ˜μ΄μ§€μ—λ§Œ μ‚¬μš©λ©λ‹ˆλ‹€.

μ—…λ°μ΄νŠΈλŠ” μ–΄λ–»κ²Œ λ°›λ‚˜μš”?

HACS둜 μ„€μΉ˜ν•˜μ…¨λ‹€λ©΄ μƒˆ 릴리즈 μ‹œ HACS β†’ 톡합 β†’ KR Component Kit 에 λΉ¨κ°„ 점 ν‘œμ‹œ β†’ UPDATE β†’ HA μž¬μ‹œμž‘. κΈ°μ‘΄ μ„€μ •Β·entity μœ μ§€λ¨.

μ‹ μΆ• μ•„νŒŒνŠΈμΈλ° μ‹œκ΅°κ΅¬ λͺ©λ‘μ— λ‚΄ 동이 μ—†μ–΄μš”

행정ꡬ역 μ½”λ“œκ°€ μ‹ μΆ• λ™κΉŒμ§€ μ¦‰μ‹œ λ°˜μ˜λ˜μ§€ μ•ŠλŠ” κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€. κ°€μž₯ κ°€κΉŒμš΄ 인접 동/ꡬλ₯Ό 선택해 μ£Όμ„Έμš”. 기상청 λ™λ„€μ˜ˆλ³΄λŠ” 5kmΓ—5km 격자라 인접 μ½”λ“œ 선택해도 μ‹€μ œ 날씨 거의 동일.


πŸ”„ μ—…λ°μ΄νŠΈ μ£ΌκΈ°

μΉ΄ν…Œκ³ λ¦¬ μ„œλΉ„μŠ€ μ£ΌκΈ°
μ‹€μ‹œκ°„ λ²„μŠ€/μ§€ν•˜μ²  (λŒ€μ€‘κ΅ν†΅ 메뉴) 1~2λΆ„
μ‹€μ‹œκ°„ μ„œμšΈλ²„μŠ€ / ν•œκ΅­ λ²„μŠ€ 1λΆ„ (μ„œμšΈλ²„μŠ€ κ³ μ •) / 30s~1h μ‘°μ • κ°€λŠ₯ (ν•œκ΅­ λ²„μŠ€)
μ•ˆμ „Β·μž¬λ‚œ μž¬λ‚œλ¬Έμž, μ•ˆμ „μ•Œλ¦Ό, KEPCO 5λΆ„
μ•ˆμ „Β·μž¬λ‚œ μ§€μ§„, κΈ°μƒνŠΉλ³΄ 10~15λΆ„
ν™˜κ²½/μœ ν‹Έ κ°€μŠ€μ•±, 기상청 예보, 에어코리아 20~30λΆ„
μƒν™œ μ•„λ¦¬μˆ˜, μ•½κ΅­, μœ κ°€ 1μ‹œκ°„
μƒν™œ 학ꡐ (κΈ‰μ‹Β·μ‹œκ°„ν‘œ) 6μ‹œκ°„

πŸ’‘ μ•½κ΅­ open_now(μ§€κΈˆ μ˜μ—…μ€‘) λŠ” 데이터 κ°±μ‹ κ³Ό λ³„κ°œλ‘œ λŒ€μ‹œλ³΄λ“œ λ Œλ” μ‹œλ§ˆλ‹€ μ‹€μ‹œκ°„ μž¬κ³„μ‚°.


⚠️ μ•Œλ €μ§„ ν•œκ³„ (μ •μ§ν•œ 곡개)

λ³Έ μ»΄ν¬λ„ŒνŠΈλŠ” 일뢀 μ„œλΉ„μŠ€μ—μ„œ 비곡식 경둜(μŠ€ν¬λž˜ν•‘Β·λͺ¨λ°”일 μ•± API)λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. μ™ΈλΆ€ μ‚¬μ΄νŠΈ λ³€κ²½ μ‹œ μΌμ‹œμ μœΌλ‘œ 깨질 수 μžˆλŠ” 약점을 λͺ¨λ‘ κ³΅κ°œν•©λ‹ˆλ‹€.

μ„œλΉ„μŠ€ ν•œκ³„
🚨 μ•ˆμ „μ•Œλ¦Ό / πŸ“’ μž¬λ‚œλ¬Έμž safekorea.go.kr HTML μŠ€ν¬λž˜ν•‘ / safetydata.go.kr API. μ •λΆ€ μ‚¬μ΄νŠΈ 점검 μ‹œ μΌμ‹œ λ―Έμž‘λ™ κ°€λŠ₯. μž¬λ‚œλ¬ΈμžλŠ” chrome 5μ’… impersonation rotation 지원, μ•ˆμ „μ•Œλ¦Όμ€ chrome120 단일
⚑ KEPCO ν•œμ „ νŽ˜μ΄μ§€λͺ… λ³€κ²½ μ‹œ 둜그인 감지 μ‹€νŒ¨ κ°€λŠ₯ (2FA 미지원). HA 둜그 KEPCO login: unknown redirect 둜 디버깅
πŸ’§ μ•„λ¦¬μˆ˜ μ„œμšΈμ‹œμ²­ νŽ˜μ΄μ§€(i121.seoul.go.kr) HTML ꡬ쑰 λ³€κ²½ μ‹œ νŒŒμ‹± μ‹€νŒ¨ κ°€λŠ₯. 9자리 μˆ˜μš©κ°€λ²ˆν˜Έ κ°€μ •
🏠 κ°€μŠ€μ•± λͺ¨λ°”일 μ•± λ‚΄λΆ€ API. νŒ¨ν‚· 캑처(mitmproxy/Charles)둜 토큰 μΆ”μΆœ ν•„μš” β€” 일반 μ‚¬μš©μžμ—κ²Œ λΆ€λ‹΄ 큼
🌫️ 에어코리아 μƒν™œμ§€μˆ˜ (UVΒ·λŒ€κΈ°μ •μ²΄) μ½”λ“œλŠ” V4 endpoint 호좜, 포털은 V5둜 μ—…κ·Έλ ˆμ΄λ“œλœ λ“― β€” μ‹€μ œ λ™μž‘ 미검증. λ―Έμ„Έλ¨Όμ§€(ν•„μˆ˜ 2건)λŠ” 영ν–₯ μ—†μŒ
🏫 NEIS 데이터 μ—†λŠ” λ‚ (λ°©ν•™Β·νœ΄μΌ)에 INFO-200 응닡을 μ—λŸ¬λ‘œ 처리 β†’ μΌμ‹œ μ—λŸ¬ 둜그 κ°€λŠ₯ (μ‹€μ œ λ™μž‘μ—λŠ” 영ν–₯ 적음)

βœ… 검증 μ™„λ£Œ: μ•½κ΅­ (μ‹œν₯μ‹œ β€” μ‹€μ œ sensor state=20, 20개 μ•½κ΅­ attribute 정상). μ•ˆμ „μ•Œλ¦Ό (μ‹œν₯μ‹œ 은행동 cascading 등둝 성곡). μž¬λ‚œλ¬Έμž (safetydata.go.kr ν‚€ λ°œκΈ‰ β†’ entity 정상 λ™μž‘, 2026-05-14).

πŸ› μ‚¬μ΄νŠΈ λ³€κ²½μœΌλ‘œ κΉ¨μ‘Œλ‹€λ©΄ GitHub Issues에 μ•Œλ €μ£Όμ„Έμš”. λΉ λ₯΄κ²Œ μˆ˜μ • PR μž‘μ„±ν•©λ‹ˆλ‹€.


πŸ› 문제 ν•΄κ²°

API ν‚€ 인증 μ‹€νŒ¨

  • μ‹ μ²­ ν›„ ν™œμ„±ν™”κΉŒμ§€ 1~2μ‹œκ°„ λŒ€κΈ° (특히 μš΄μ˜κΈ°κ΄€ ν‚€)
  • data.go.kr μ•ˆμ—μ„œλ„ 데이터셋별 ν™œμš©μ‹ μ²­ 별도 β€” μ•½κ΅­ ν‚€λ‘œ κΈ°μƒνŠΉλ³΄ ν˜ΈμΆœν•˜λ©΄ 403
  • μž¬λ‚œλ¬ΈμžλŠ” safetydata.go.kr 별도 포털 β€” data.go.kr ν‚€λ‘œλŠ” μ•ˆ 됨
  • 401 = ν‚€ μžμ²΄κ°€ 잘λͺ», 403 = ν‚€λŠ” λ§žμ§€λ§Œ ν•΄λ‹Ή 데이터셋 ν™œμš©μ‹ μ²­ μ•ˆ 됨
  • 일일 νŠΈλž˜ν”½ ν•œλ„ μ΄ˆκ³Όλ„ 동일 증상 (λ§ˆμ΄νŽ˜μ΄μ§€μ—μ„œ 확인)

둜그인 μ‹€νŒ¨ (KEPCO / μ•„λ¦¬μˆ˜ / κ°€μŠ€μ•±)

  • μ›Ήμ‚¬μ΄νŠΈμ—μ„œ 직접 둜그인 κ°€λŠ₯ν•œμ§€ 확인
  • 2μ°¨ 인증(OTP) μ„€μ •λœ 계정은 미지원
  • κ°€μŠ€μ•±μ€ 토큰이 자주 만료 β€” μ•±μ—μ„œ λ‹€μ‹œ λ°œκΈ‰

데이터가 λΉ„μ–΄μžˆμ„ λ•Œ (μ•ˆμ „μ•Œλ¦Ό / μž¬λ‚œλ¬Έμž)

  • λ“±λ‘ν•œ 지역에 졜근 λ©”μ‹œμ§€κ°€ μ—†μœΌλ©΄ sensor stateκ°€ μ—†μŒ β€” 정상 λ™μž‘
  • μ •λΆ€ μ‚¬μ΄νŠΈ 점검 쀑이면 μž μ‹œ ν›„ μžλ™ 볡ꡬ

κ·Έλž˜λ„ μ•ˆ 풀리면

  1. 둜그 확인 β€” μ„€μ • β†’ μ‹œμŠ€ν…œ β†’ 둜그 μ—μ„œ kr_component_kit 검색
  2. 이슈 등둝 β€” GitHub Issues β€” λ‹€μŒ 정보 포함:
    • μ–΄λ–€ μ„œλΉ„μŠ€ (예: "μ•½κ΅­ β€” μ„œμšΈ 강남ꡬ")
    • HA 버전 + λ³Έ μ»΄ν¬λ„ŒνŠΈ 버전
    • 둜그 μ—λŸ¬ (κ°œμΈμ •λ³΄Β·ν‚€λŠ” κ°€λ¦° ν›„)
    • μ‹œλ„ν•œ 단계

πŸ’¬ ν•œκ΅­μ–΄ κ·ΈλŒ€λ‘œ μž‘μ„±ν•΄μ£Όμ…”λ„ λ©λ‹ˆλ‹€. 닡변도 ν•œκ΅­μ–΄λ‘œ.


πŸ“‹ μš”κ΅¬μ‚¬ν•­

  • Home Assistant 2023.1.0 이상
  • Python 3.11 이상 (HA 자체 μš”κ΅¬μ‚¬ν•­)
  • 인터넷 μ—°κ²° (각 μ„œλΉ„μŠ€ API μ ‘κ·Ό)
  • μžλ™ μ„€μΉ˜ νŒ¨ν‚€μ§€: curl_cffi>=0.7.0, beautifulsoup4>=4.12.0 (manifest.json μ •μ˜)

⚠️ λ©΄μ±…μ‘°ν•­

  • λ³Έ μ»΄ν¬λ„ŒνŠΈλŠ” 일뢀 μ„œλΉ„μŠ€μ—μ„œ 곡식 APIκ°€ μ•„λ‹Œ 인증된 μ›Ή μŠ€ν¬λž˜ν•‘ / λͺ¨λ°”일 μ•± λ‚΄λΆ€ API λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€ (KEPCO, μ•„λ¦¬μˆ˜, κ°€μŠ€μ•±, μ•ˆμ „μ•Œλ¦Ό)
  • 각 μ„œλΉ„μŠ€ μ œκ³΅μ—…μ²΄μ˜ μ •μ±… 변경에 따라 λ™μž‘ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€
  • μ •λΆ€ μ‚¬μ΄νŠΈ μΌλΆ€λŠ” TLS 검증 우회 (verify=False) β€” μ •λΆ€ μ‚¬μ΄νŠΈμ˜ TLS μ„€μ • ν˜Έν™˜μ„± 이슈 νšŒν”Όμš©. λ³΄μ•ˆμ— λ―Όκ°ν•˜μ‹œλ©΄ μ½”λ“œλ₯Ό 직접 확인해 μ£Όμ„Έμš”
  • κ°œμΈμ •λ³΄(ID/λΉ„λ°€λ²ˆν˜Έ/토큰/API ν‚€)λŠ” Home Assistant λ‚΄λΆ€ μ €μž₯μ†Œμ—λ§Œ λ³΄κ΄€λ˜λ©° μ™ΈλΆ€ 전솑 μ—†μŒ
  • λ³Έ ν”„λ‘œμ νŠΈλŠ” 정뢀·곡곡기관과 λ¬΄κ΄€ν•œ 비곡식 μ„œλ“œνŒŒν‹° 톡합. μ‚¬μš©μžμ˜ μ±…μž„ ν•˜μ— μ΄μš©ν•΄ μ£Όμ„Έμš”.

πŸ™ μ›μž‘μž / Credits

λ³Έ ν†΅ν•©μ˜ λ²„μŠ€ λͺ¨λ“ˆ 두 κ°œλŠ” λ‹€μŒ μ˜€ν”ˆμ†ŒμŠ€ ν”„λ‘œμ νŠΈλ“€μ˜ μž‘μ—…μ„ μ°Έκ³ /κ³„μŠΉν•΄ λ§Œλ“€μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€. 각 μ›μž‘μžλΆ„λ“€κ»˜ 깊이 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

λͺ¨λ“ˆ μ›μž‘μž 원본
🚍 ν•œκ΅­ λ²„μŠ€ (korea_bus/) luiseok https://github.com/luiseok/ha-korea-bus-arrival
🚌 μ„œμšΈλ²„μŠ€ (seoul_bus/) 원쑰 miumida https://github.com/miumida/seoul_bus
🚌 μ„œμšΈλ²„μŠ€ (seoul_bus/) νŒ¨ν„΄ Murianwind https://github.com/Murianwind/seoul_bus

λ³Έ 톡합이 μΆ”κ°€ν•œ κ°€μΉ˜

κΈ°λ³Έ 흐름은 μœ„ μ›μž‘λ“€μ—μ„œ κ°€μ Έμ™”κ³ , 이λ₯Ό kr_component_kit 의 톡합 νŒ¨ν„΄μœΌλ‘œ ν‘μˆ˜ν•˜λ©΄μ„œ λ‹€μŒ 뢀뢄을 보강 / μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€:

  • 두 흐름 단일 톡합 β€” 카카였맡(ν•œκ΅­λ²„μŠ€) + μ„œμšΈ 곡식 API(μ„œμšΈλ²„μŠ€) λ₯Ό 메뉴 ν•œ κ³³μ—μ„œ
  • λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ•ˆμ „λ§ β€” kakao_bus β†’ korea_bus 도메인 λ³€κ²½, entity_id suffix μ •μ • μ‹œ μ‚¬μš©μž μžλ™ν™”κ°€ κΉ¨μ§€μ§€ μ•Šλ„λ‘ async_migrate_entry
  • TIMESTAMP 기반 sensor β€” HA Weather μΉ΄λ“œμ²˜λŸΌ "NλΆ„ ν›„" μžλ™ ν‘œμ‹œ
  • stale-data 보쑴 β€” μΌμ‹œμ  API 였λ₯˜ μ‹œ 직전 κ°’ μœ μ§€
  • ν™œμ„±ν™” μŠ€μœ„μΉ˜ (Murianwind νŒ¨ν„΄ κ³„μŠΉ) + μƒˆλ‘œκ³ μΉ¨ λ²„νŠΌ
  • μ €μƒλ²„μŠ€ / 만차 binary_sensor (μ„œμšΈ μ •λ₯˜μ†Œμ •λ³΄μ‘°νšŒ μ‘λ‹΅μ˜ busType / isFullFlag / congestion ν™œμš©)
  • 닀쀑 μ •λ₯˜μž₯ / μ˜΅μ…˜ 메뉴 둜 μ •λ₯˜μž₯ μΆ”κ°€Β·μ‚­μ œΒ·λ…Έμ„  νŽΈμ§‘ κ°€λŠ₯
  • 8개 μžλ™ν™” λΈ”λ£¨ν”„λ¦°νŠΈ (좜발 / ν•˜μ°¨ / 막차 / 만차 / μ •λ₯˜μž₯ 근처 / μ§‘ λ– λ‚  λ•Œ / λͺ©μ μ§€ 도착 / μΆœν‡΄κ·Ό μžλ™)
  • i18n 4 lang (strings + en + ko + ja)

μ›μž‘μ΄ μ—†μ—ˆλ‹€λ©΄ 이 톡합도 μ—†μ—ˆμŠ΅λ‹ˆλ‹€. πŸ™


🀝 κΈ°μ—¬ / λΌμ΄μ„ μŠ€

  • λΌμ΄μ„ μŠ€: MIT β€” 자유둭게 μ‚¬μš©Β·μˆ˜μ •Β·μž¬λ°°ν¬ κ°€λŠ₯
  • 이슈·PR ν™˜μ˜: https://github.com/redchupa/kr_component_kit/issues
  • μƒˆ ν•œκ΅­ μ„œλΉ„μŠ€ μΆ”κ°€ μ œμ•ˆλ„ ν™˜μ˜ν•©λ‹ˆλ‹€

⭐ 도움이 λ˜μ…¨λ‹€λ©΄

였λ₯Έμͺ½ 상단 Star ⭐ ν•œ 번이면 큰 도움이 λ©λ‹ˆλ‹€. 별이 λͺ¨μ΄λ©΄ HACS Default Repository 등둝 κ°€λŠ₯성이 μ˜¬λΌκ°€κ³ , 더 λ§Žμ€ ν•œκ΅­ μ‚¬μš©μžκ°€ λ°œκ²¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Star History Chart


β˜• 후원

이 ν”„λ‘œμ νŠΈκ°€ 도움이 λ˜μ…¨λ‹€λ©΄ 컀피 ν•œ μž”μœΌλ‘œ 응원해 μ£Όμ„Έμš” πŸ™

ν† μŠ€
Toss 후원 QR
PayPal
PayPal 후원 QR

Made with ❀️ for Korean Home Assistant Users

About

πŸ‡°πŸ‡· Home Assistant integration for Korea-only services: KEPCO, Arisu water, safety alerts, GasApp, Kakao Map, GoodsFlow, and more public services.

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages