ํ๊ตญ ๊ฑฐ์ฃผ์๋ฅผ ์ํ Home Assistant ํตํฉ โ ์ ๊ธฐยท์๋ยท๊ฐ์คยท๋ ์จยท์ฌ๋ยท์ฝ๊ตญยทํ๊ต ๊ธ์ยท์ค์๊ฐ ๋์ค๊ตํต๊น์ง, ํ๊ตญ์์๋ง ์ธ ์ ์๋ 13๊ฐ์ง ๊ณต๊ณต ์๋น์ค๋ฅผ ํ ํจํค์ง๋ก.
๐ฐ๐ท ํ๊ตญ์ด (์ด ํ์ด์ง) ยท ๐ฌ๐ง English README
๐ฌ๐ง 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.
์ MY HACS ๋ฑ์ง๋ฅผ ๋๋ฅด๋ฉด ์๋์ผ๋ก HA๊ฐ ์ด๋ฆฝ๋๋ค โ DOWNLOAD โ ์ฌ์์.
HACS๊ฐ ์์ผ์๋ค๋ฉด โ HACS ๊ณต์ ์ค์น ๊ฐ์ด๋ ๋จผ์ .
์ค์ โ ๊ธฐ๊ธฐ ๋ฐ ์๋น์ค โ + ํตํฉ ๊ตฌ์ฑ์์ ์ถ๊ฐ
โ ๊ฒ์์ฐฝ์ ํ๊ตญ ์ปดํฌ๋ํธ ํคํธ (์๋ฌธ ๋๋ฉ์ธ kr_component_kit ๋ ๊ฐ๋ฅ)
โ ๐จ ์์ ์๋ฆผ ์ ํ โ ์๋/์๊ตฐ๊ตฌ/์๋ฉด๋ ์ ํ โ ์ ์ถ
๊ฐ๋ฐ์ ๋๊ตฌ โ ์ํ ์์ ์นํ ์ด๋ฆ ์ต์ ์์ ์๋ฆผ ๊ฒ์ โ state์ ๊ฐ์ฅ ์ต๊ทผ ํ์๋ถ ์์ ๋ฉ์์ง ํ์.
์ค๋น๋์๋ฉด ๐ API ํค ๋ฐ๊ธ ๊ฐ์ด๋๋๋ก ๋ค๋ฅธ 12๊ฐ๋ฅผ ํ๋์ฉ ์ถ๊ฐํ์๋ฉด ๋ฉ๋๋ค.
| ์๋น์ค | ์นดํ ๊ณ ๋ฆฌ | 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๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฒฐ์ ยท๊ณผ๊ธ ์ผ์ ์์.
โ ๏ธ ์์ฃผ ๋ฐ์ํ๋ ์ค์ 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 ์ฝ๊ตญ ํญ๋ชฉ์ ๊ทธ๋๋ก ๋ถ์ฌ๋ฃ๊ธฐ.
| ํญ๋ชฉ | ๊ฐ |
|---|---|
| ๐ ํฌํธ | ํ์ ์์ ๋ถ ์์ ๋ฐ์ดํฐ๊ณต์ ํ๋ซํผ (safetydata.go.kr) |
| ์ด์๊ธฐ๊ด | ํ์ ์์ ๋ถ |
| ์ ํํ ๋ฐ์ดํฐ์ ๋ช | ํ์ ์์ ๋ถ_๊ธด๊ธ์ฌ๋๋ฌธ์ |
| ์ฝ๋ ํธ์ถ endpoint | /V2/api/DSSP-IF-00247 |
| ๋ฐ๊ธ ๋ฐฉ์ | ์ด์์ ๊ฒํ ํ ๋ฐ๊ธ (์ฆ์ ์๋ ๋ฐ๊ธ โ, 1~3 ์์ ์ผ) |
| ์ผ์ผ ํธ์ถ ํ๋ | ๊ธฐ๋ณธ 1,000๊ฑด. ํตํฉ์ 5๋ถ ํด๋ง์ด๋ผ 288๊ฑด/์ผ ์ฌ์ฉ โ ์ถฉ๋ถ |
| ํค ์ ํจ๊ธฐ๊ฐ | 1๋ (๋ง๋ฃ ํ ๋ง์ดํ์ด์ง์์ ์ฌ๋ฐ๊ธ โ ๋ง๋ฃ์ผ์ ํ๋ฉด์์ ํ์ธ) |
| ํค ํํ | ๋จ์ผ ํํ๋ง ์ ๊ณต (data.go.kr ์ฒ๋ผ Decoding/Encoding ๋ ๊ฐ์ง โ) |
| IP ํ์ |
โ ๏ธ ์์ ๋ฐ์ดํฐ๊ณต์ ํ๋ซํผ์ ๊ณต๊ณต๋ฐ์ดํฐํฌํธ๊ณผ ๋ค๋ฅธ ์ฌ์ดํธ์ ๋๋ค. ์ด๋ฏธdata.go.kr๊ณ์ ์ด ์์ด๋ ๋ณ๋ ๊ฐ์ ์ด ํ์ํฉ๋๋ค.
safetydata.go.kr ํ์๊ฐ์
. data.go.kr ๊ณ์ ์ผ๋ก๋ ๋ก๊ทธ์ธ๋์ง ์์ต๋๋ค.
์๋จ ๊ฒ์์ฐฝ์ ์ฌ๋๋ฌธ์ โ ๊ฒ์ ๊ฒฐ๊ณผ ์นด๋๋ฅผ ๋ณด๋ฉด ๋ ๊ฐ๊ฐ ๋์ต๋๋ค:
| ์นด๋ | ์ฌ์ฉ ์ฌ๋ถ |
|---|---|
ํ์ ์์ ๋ถ_๊ธด๊ธ์ฌ๋๋ฌธ์ (์กฐํ 5๋ง+ / ๋ค์ด๋ก๋ 28M / #์ฌ๋๋ฌธ์ ํ๊ทธ) |
โ ์ด๊ฑธ ์ ์ฒญ |
์ฌ๋๋ฌธ์(์๋ณด) (์กฐํ 900+ / ํ๊ทธ #-1) |
โ endpoint ์ฝ๋๊ฐ ๋ฌ๋ผ ํตํฉ๊ณผ ํธํ ์ ๋จ |
์ฌ๋ฐ๋ฅธ ์นด๋ ํด๋ฆญ โ ์์ธ ํ์ด์ง์์ endpoint ๊ฐ DSSP-IF-00247 ์ธ์ง ํ ๋ฒ ํ์ธ.
์์ธ ํ์ด์ง โ ์คํ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๊ฐ ์ ์ฒญ์์ ๋ฃ์ ๊ฐ.
โฃ ๋ผ์ด์ ์ค ๋์ โ ์ด์ฉ์ ์ฒญ ๋ฒํผ ํด๋ฆญ.
๋ง์ดํ์ด์ง โ "๋ฐ์ดํฐ ํ์ฉ์ ์ฒญ ๋ด์ญ" ์์ ์ํ ํ์ธ:
- "์น์ธ ๋๊ธฐ ์ค์ ๋๋ค" โ ์ด์์ ๊ฒํ ์ค. ์๋ ๋ฐ๊ธ์ด ์๋๋ฏ๋ก ์์ ์ผ ๊ธฐ์ค 1~3์ผ ์ ๋ ๋๊ธฐ ์์.
- "๋ฐ๊ธ๋จ" โ ์๋น์คํค ๊ฐ์ด ๋ ธ์ถ๋๊ณ ํค ์ฌ์ฉ ๊ฐ๋ฅ.
๋ง์ดํ์ด์ง โ ๋ฐ๊ธ๋ ํค ์ "๊ฐ ๋ณต์ฌํ๊ธฐ" ํด๋ฆญ โ 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 [] |
์ ์ โ ์ต๊ทผ ์ฌ๋๋ฌธ์๊ฐ ์๋ ์๊ฐ๋ | ์กฐ์ฉํ ์๊ฐ์๋ ๋น ์๋ต์ด ์ ์. ํฐ ์ฌ๋ยท๊ธฐ์ํน๋ณด ์ ์ฑ์์ง |
์ธ ๋ฐ์ดํฐ์
๋ชจ๋ data.go.kr ์ด์๊ธฐ๊ด ๊ธฐ์์ฒญ (1360000). ์ธ์ฆํค๋ ๋ด ๊ณ์ ์ ํ๋์ ํค๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ์ง๋ง, ํ์ฉ์ ์ฒญ์ ๊ฐ๊ฐ ๋ฐ๋ก ํด์ผ ํฉ๋๋ค.
| ์๋น์ค | ๋ฐ๋ก ๊ฒ์ | ๊ฒ์์ด | endpoint |
|---|---|---|---|
| ๐ช๏ธ ๊ธฐ์ํน๋ณด | ๐ ๊ธฐ์ํน๋ณด ๊ฒ์ | ๊ธฐ์ํน๋ณด |
1360000/WthrWrnInfoService |
| ๐ ์ง์ง์ ๋ณด | ๐ ์ง์ง์ ๋ณด ๊ฒ์ | ์ง์ง์ ๋ณด |
1360000/EqkInfoService |
| โ ๋จ๊ธฐ์๋ณด | ๐ ๋จ๊ธฐ์๋ณด ๊ฒ์ | ๋จ๊ธฐ์๋ณด |
1360000/VilageFcstInfoService_2.0 |
data.go.kr ์ด์๊ธฐ๊ด ํ๊ตญํ๊ฒฝ๊ณต๋จ (B552584) ์ ๋ฐ์ดํฐ์
2๊ฑด์ ๊ฐ๊ฐ ํ์ฉ์ ์ฒญํด์ผ ํฉ๋๋ค.
| ๋ฐ์ดํฐ์ | ๋ฐ๋ก ๊ฒ์ | ๊ฒ์์ด | endpoint |
|---|---|---|---|
| ์ธก์ ์์ ๋ณด | ๐ ์ธก์ ์์ ๋ณด | ์์ด์ฝ๋ฆฌ์ ์ธก์ ์ |
B552584/MsrstnInfoInqireSvc |
| ๋๊ธฐ์ค์ผ์ ๋ณด | ๐ ๋๊ธฐ์ค์ผ์ ๋ณด | ์์ด์ฝ๋ฆฌ์ ๋๊ธฐ์ค์ผ |
B552584/ArpltnInforInqireSvc |
๐ก ์ธก์ ์์ ๋ณด ๋น ์ง๋ฉด HA ์ค์ ํ๋ฉด์ ์ธก์ ์ dropdown์ด ๋น์ด ๋ณด์ ๋๋ค.
โ ๏ธ ์ต์ โ ์ํ๊ธฐ์์ง์ (UVยท๋๊ธฐ์ ์ฒด): ์ฌ์ฉํ๋ ค๋ฉด ์ถ๊ฐ๋ก์ํ๊ธฐ์์ง์๊ฒ์ โ ๊ธฐ์์ฒญ ๋ฐ์ดํฐ์ ํ์ฉ์ ์ฒญ. ๋จ ์ฝ๋๋ V4 endpoint ํธ์ถ์ด์ง๋ง ํฌํธ์ V5๋ก ์ ๊ทธ๋ ์ด๋๋ ์ํ๋ก ๋ณด์ ๋๋ค โ ์ค์ ๋์ ๋ฏธ๊ฒ์ฆ. ๋ฑ๋ก ํ HA ๋ก๊ทธ(LivingWthrIdx๊ฒ์)๋ก ํ์ธํ์ธ์. ๋ฏธ์๋ ์ issue ๋ถํ๋๋ฆฝ๋๋ค.
| ํญ๋ชฉ | ๊ฐ |
|---|---|
| ๐ ํฌํธ | ๐ Opinet ์คํผ๋ท API ์ ์ฒญ ํ์ด์ง |
| ๋ฐ๊ธ ์ ์ฐจ | ๋ฌด๋ฃ ํ์๊ฐ์ โ API ์ ์ฒญ โ ์ฆ์ ๋ฐ๊ธ |
| ์ฝ๋ ํธ์ถ endpoint | opinet.co.kr/api/avgAllPrice.do, lowTop10.do |
๐ก Opinet์ ๊ณต๊ณต๋ฐ์ดํฐํฌํธ๊ณผ ๋ณ๊ฐ ํฌํธ์ ๋๋ค.
| ํญ๋ชฉ | ๊ฐ |
|---|---|
| ๐ ํฌํธ | ๐ 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๋ฒ ๋ฑ๋ก).
ํด๋น ํญ๋ชฉ ์ "๊ตฌ์ฑ" ๋ฒํผ โ ์ ๋ ฅ๊ฐ ํธ์ง. (์ญ์ ยท์ฌ๋ฑ๋ก ์์ด ๊ฐ๋ฅ. entity์ ์๋ํ ์ฐ๊ฒฐ ์ ์ง๋จ.)
| ์๋น์ค | ์ด๋์ ๋ฐ๋๊ฐ |
|---|---|
| โก KEPCO | ํ์ ํํ์ด์ง ID/๋น๋ฐ๋ฒํธ (๋ณธ์ธ ๊ณ์ , 2์ฐจ ์ธ์ฆ ๋ฏธ์ง์) |
| ๐ง ์๋ฆฌ์ | ์ข ์ด ๊ณ ์ง์ ๋๋ ์๋ฆฌ์ ์ฌ์ด๋ฒ ๊ณ ๊ฐ์ผํฐ โ ์๊ธ์กฐํ ์ข์ธก ์์ฉ๊ฐ๋ฒํธ + ๊ณ ๊ฐ๋ช |
| ๐ ๊ฐ์ค์ฑ | ์ฌ์ฉ๊ณ์ฝ๋ฒํธ๋ ๊ฐ์ค์ฑ ๋ชจ๋ฐ์ผ ์ฑ โ ๋ด ์ ๋ณด. ํ ํฐยทํ์ID๋ mitmproxy ๋ฑ์ผ๋ก ๋ชจ๋ฐ์ผ ์ฑ HTTPS ์์ฒญ์ X-Token/X-Member ํค๋ ์ถ์ถ ( |
| ๐ ์ง์ง ์ขํ | ๊ธฐ๋ณธ๊ฐ์ ์์ธ์์ฒญ (37.5665, 126.978). ๋ณธ์ธ ์ง ์ขํ๋ก ๊ผญ ๋ณ๊ฒฝ. ๊ธฐ๋ณธ ๋ฐ๊ฒฝ 200km / ์ต์ ๊ท๋ชจ 3.0 |
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.<ํฐ>์ผ๋ก ๋ณ๊ฒฝ.
HA์ Assist + LLM ํตํฉ (OpenAI / Google / Ollama ๋ฑ)์ ๋ณธ ์ปดํฌ๋ํธ๋ฅผ ๋ ธ์ถํ๋ฉด ํ๊ตญ์ด๋ก ์ง์ ๋ฌผ์ ์ ์์ต๋๋ค.
| ์ง๋ฌธ | ๋งค์นญ ์๋น์ค |
|---|---|
| "์ง๊ธ ์์ ์ค์ธ ๊ฐ๊น์ด ์ฝ๊ตญ ์๋ ค์ค" | ๐ ์ฝ๊ตญ |
| "์ค๋ ๋ฏธ์ธ๋จผ์ง ์ด๋?" | ๐ซ๏ธ ์์ด์ฝ๋ฆฌ์ |
| "๋ด์ผ ๋น ์?" | โ ๊ธฐ์์ฒญ |
| "์ต๊ทผ ์ฌ๋๋ฌธ์ ๋ญ ์์ด?" | ๐ข ์ฌ๋๋ฌธ์ |
| "์ค๋ ๊ธ์ ๋ญ์ผ?" | ๐ซ ํ๊ต |
| "๋ค์ ๋ฒ์ค ์ธ์ ์?" | ๐ ๋์ค๊ตํต |
LLM์ ๋ ธ์ถ ์ ํด๋ ์ผ๋ฐ sensor/event/weather ์ํฐํฐ๋ก ์ ์ ๋์. ์ถ๊ฐ ์ค์ ๋ถํ์.
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 ์์ฑํฉ๋๋ค.
- ์ ์ฒญ ํ ํ์ฑํ๊น์ง 1~2์๊ฐ ๋๊ธฐ (ํนํ ์ด์๊ธฐ๊ด ํค)
data.go.kr์์์๋ ๋ฐ์ดํฐ์ ๋ณ ํ์ฉ์ ์ฒญ ๋ณ๋ โ ์ฝ๊ตญ ํค๋ก ๊ธฐ์ํน๋ณด ํธ์ถํ๋ฉด 403- ์ฌ๋๋ฌธ์๋
safetydata.go.kr๋ณ๋ ํฌํธ โdata.go.krํค๋ก๋ ์ ๋จ 401= ํค ์์ฒด๊ฐ ์๋ชป,403= ํค๋ ๋ง์ง๋ง ํด๋น ๋ฐ์ดํฐ์ ํ์ฉ์ ์ฒญ ์ ๋จ- ์ผ์ผ ํธ๋ํฝ ํ๋ ์ด๊ณผ๋ ๋์ผ ์ฆ์ (๋ง์ดํ์ด์ง์์ ํ์ธ)
- ์น์ฌ์ดํธ์์ ์ง์ ๋ก๊ทธ์ธ ๊ฐ๋ฅํ์ง ํ์ธ
- 2์ฐจ ์ธ์ฆ(OTP) ์ค์ ๋ ๊ณ์ ์ ๋ฏธ์ง์
- ๊ฐ์ค์ฑ์ ํ ํฐ์ด ์์ฃผ ๋ง๋ฃ โ ์ฑ์์ ๋ค์ ๋ฐ๊ธ
- ๋ฑ๋กํ ์ง์ญ์ ์ต๊ทผ ๋ฉ์์ง๊ฐ ์์ผ๋ฉด sensor state๊ฐ
์์โ ์ ์ ๋์ - ์ ๋ถ ์ฌ์ดํธ ์ ๊ฒ ์ค์ด๋ฉด ์ ์ ํ ์๋ ๋ณต๊ตฌ
- ๋ก๊ทธ ํ์ธ โ ์ค์ โ ์์คํ
โ ๋ก๊ทธ ์์
kr_component_kit๊ฒ์ - ์ด์ ๋ฑ๋ก โ 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 ๋ฑ๋ก ๊ฐ๋ฅ์ฑ์ด ์ฌ๋ผ๊ฐ๊ณ , ๋ ๋ง์ ํ๊ตญ ์ฌ์ฉ์๊ฐ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค.
์ด ํ๋ก์ ํธ๊ฐ ๋์์ด ๋์ จ๋ค๋ฉด ์ปคํผ ํ ์์ผ๋ก ์์ํด ์ฃผ์ธ์ ๐
ํ ์ค
|
PayPal
|
Made with โค๏ธ for Korean Home Assistant Users

