Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

100 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

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

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages