Skip to content

redchupa/kr_component_kit

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

61 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ‡ฐ๐Ÿ‡ท KR Component Kit

ํ•œ๊ตญ ๊ฑฐ์ฃผ์ž๋ฅผ ์œ„ํ•œ Home Assistant ํ†ตํ•ฉ โ€” ์ „๊ธฐยท์ˆ˜๋„ยท๊ฐ€์Šคยท๋‚ ์”จยท์žฌ๋‚œยท์•ฝ๊ตญยทํ•™๊ต ๊ธ‰์‹ยท์‹ค์‹œ๊ฐ„ ๋Œ€์ค‘๊ตํ†ต๊นŒ์ง€, ํ•œ๊ตญ์—์„œ๋งŒ ์“ธ ์ˆ˜ ์žˆ๋Š” 13๊ฐ€์ง€ ๊ณต๊ณต ์„œ๋น„์Šค๋ฅผ ํ•œ ํŒจํ‚ค์ง€๋กœ.

๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ์–ด (์ด ํŽ˜์ด์ง€) ยท ๐Ÿ‡ฌ๐Ÿ‡ง 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 13 Korea-only public services (KEPCO electricity, Seoul water, city gas, KMA weather, disaster alerts, NMC pharmacy, NEIS school meals, Seoul subway + KakaoMap bus, 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๊ฐœ๋ฅผ ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ“‹ 13๊ฐ€์ง€ ์„œ๋น„์Šค ํ•œ๋ˆˆ์—

์„œ๋น„์Šค ์นดํ…Œ๊ณ ๋ฆฌ 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 ๊ธ‰์‹ยท์‹œ๊ฐ„ํ‘œยทํ•™์‚ฌ์ผ์ •
๐ŸšŒ ๋Œ€์ค‘๊ตํ†ต ์ƒํ™œ ๋ถ€๋ถ„ ์ง€ํ•˜์ฒ : ์„œ์šธ ํ‚ค / ๋ฒ„์Šค: ํ‚ค ๋ถˆํ•„์š” (์นด์นด์˜ค๋งต)

๐Ÿ’ก ํ•ต์‹ฌ: ๋ชจ๋“  ์„œ๋น„์Šค๋Š” ๋ฌด๋ฃŒ ์ •๋ถ€ยท๊ณต๊ณต๊ธฐ๊ด€ 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 ํ‘œ์‹œ).


๐ŸšŒ ๋Œ€์ค‘๊ตํ†ต โ€” ์‹œ๋‚˜๋ฆฌ์˜ค๋ณ„ ํ‚ค

๋ณธ์ธ์ด ์“ธ ๊ธฐ๋Šฅ์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ํ‚ค๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์‹œ๋‚˜๋ฆฌ์˜ค ํ•„์š”ํ•œ ํ‚ค ๋ฐœ๊ธ‰์ฒ˜
์ง€ํ•˜์ฒ  ๋„์ฐฉ์ •๋ณด ์„œ์šธ ์—ด๋ฆฐ๋ฐ์ดํ„ฐ๊ด‘์žฅ ํ‚ค ๐Ÿ‘‰ data.seoul.go.kr โ†’ ์ง€ํ•˜์ฒ  ์‹ค์‹œ๊ฐ„ ๋„์ฐฉ์ •๋ณด ์‹ ์ฒญ
๋ฒ„์Šค ๋„์ฐฉ์ •๋ณด โŒ ๋ถˆํ•„์š” ์นด์นด์˜ค๋งต ๋น„๊ณต์‹ endpoint ์‚ฌ์šฉ. ์ •๋ฅ˜์žฅ ID๋งŒ ์ž…๋ ฅ
ํ™˜์Šน๊ฒฝ๋กœ ๊ฒ€์ƒ‰ (์˜ต์…˜) ์„œ์šธ์‹œ ํ™˜์Šน๊ฒฝ๋กœ API ํ‚ค ๐Ÿ‘‰ data.go.kr โ†’ ๋Œ€์ค‘๊ตํ†ตํ™˜์Šน๊ฒฝ๋กœ

์นด์นด์˜ค๋งต ์ •๋ฅ˜์žฅ ID ์ฐพ๋Š” ๋ฒ• (๋ฒ„์Šค ๋“ฑ๋ก ์‹œ): ์นด์นด์˜ค๋งต โ†’ ์ •๋ฅ˜์žฅ ๊ฒ€์ƒ‰ โ†’ ์ •๋ฅ˜์žฅ ํด๋ฆญ โ†’ URL ?busstopid=03171&... โ†’ busstopid= ๋’ค์˜ ๊ฐ’ ๋ณต์‚ฌ (์˜ˆ: 03171, BS09013700).


โš™๏ธ ๋“ฑ๋กยท์žฌ์„ค์ • ํ๋ฆ„

์ƒˆ ํ•ญ๋ชฉ ๋“ฑ๋ก

์„ค์ • โ†’ ๊ธฐ๊ธฐ ๋ฐ ์„œ๋น„์Šค โ†’ + ํ†ตํ•ฉ ๊ตฌ์„ฑ์š”์†Œ ์ถ”๊ฐ€ โ†’ ํ•œ๊ตญ ์ปดํฌ๋„ŒํŠธ ํ‚คํŠธ ๊ฒ€์ƒ‰ โ†’ ์›ํ•˜๋Š” ์„œ๋น„์Šค ์„ ํƒ.

ํ•œ ํ†ตํ•ฉ์— 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๋ถ„ ํ›„"๋กœ ์ž๋™ ํ‘œ์‹œ) โ€”

๐ŸŽจ ๋Œ€์‹œ๋ณด๋“œ ์˜ˆ์ œ โ€” ์•ฝ๊ตญ ๊ฐ€๊นŒ์šด ์ˆœ + ์˜์—…์ค‘ ํ•„ํ„ฐ + ์นด์นด์˜ค๋งต ๊ธธ์ฐพ๊ธฐ

๊ฒ€์ƒ‰ยทํ•„ํ„ฐ ํ—ฌํผ ๋‘ ๊ฐœ ๋จผ์ €:

  • ์„ค์ • โ†’ ํ—ฌํผ โ†’ ํ…์ŠคํŠธ: 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๋ถ„
์•ˆ์ „ยท์žฌ๋‚œ ์žฌ๋‚œ๋ฌธ์ž, ์•ˆ์ „์•Œ๋ฆผ, 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 ๋‚ด๋ถ€ ์ €์žฅ์†Œ์—๋งŒ ๋ณด๊ด€๋˜๋ฉฐ ์™ธ๋ถ€ ์ „์†ก ์—†์Œ
  • ๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ์ •๋ถ€ยท๊ณต๊ณต๊ธฐ๊ด€๊ณผ ๋ฌด๊ด€ํ•œ ๋น„๊ณต์‹ ์„œ๋“œํŒŒํ‹ฐ ํ†ตํ•ฉ. ์‚ฌ์šฉ์ž์˜ ์ฑ…์ž„ ํ•˜์— ์ด์šฉํ•ด ์ฃผ์„ธ์š”.

๐Ÿค ๊ธฐ์—ฌ / ๋ผ์ด์„ ์Šค

  • ๋ผ์ด์„ ์Šค: 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