diff --git a/.gitignore b/.gitignore
index 8a4b422..fe66773 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,3 +15,10 @@ Thumbs.db
HACS_SUBMISSION.md
REDDIT_POST.md
PROMO_DRAFTS.md
+
+# Throwaway scripts / experimental files (local only)
+pharmacy_READY
+pharmacy_poll.py
+test_pharmacy_key.py
+test_*.py
+*_poll.py
diff --git a/README.md b/README.md
index ca89345..98b53e7 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,6 @@
# ๐ฐ๐ท KR Component Kit
-> ๋ํ๋ฏผ๊ตญ์์๋ง ์ฌ์ฉํ ์ ์๋ Home Assistant ํตํฉ ๊ตฌ์ฑ์์
-> Home Assistant integration for Korea-only services โ utilities, weather/disaster alerts, transit, school meals, and more.
+> **ํ๊ตญ ๊ฑฐ์ฃผ์๋ฅผ ์ํ Home Assistant ํตํฉ** โ ์ ๊ธฐยท์๋ยท๊ฐ์คยท๋ ์จยท์ฌ๋ยท์ฝ๊ตญยทํ๊ต ๊ธ์ยท์ค์๊ฐ ๋์ค๊ตํต๊น์ง, ํ๊ตญ์์๋ง ์ธ ์ ์๋ 13๊ฐ์ง ๊ณต๊ณต ์๋น์ค๋ฅผ ํ ํจํค์ง๋ก.
[![hacs][hacsbadge]][hacs]
[![GitHub Release][releases-shield]][releases]
@@ -11,492 +10,218 @@
[](https://my.home-assistant.io/redirect/hacs_repository/?owner=redchupa&repository=kr_component_kit&category=integration)
-ํ๊ตญ์ ๋ ฅ, ์๋ฆฌ์, ๊ฐ์ค์ฑ๋ถํฐ ๊ธฐ์์ฒญ ๋๋ค์๋ณดยท์ฌ๋๋ฌธ์ยท์ง์งยท์ฝ๊ตญยทํ๊ต ๊ธ์ยท์ค์๊ฐ ๋์ค๊ตํต๊น์ง โ ๋ํ๋ฏผ๊ตญ์์๋ง ์ธ ์ ์๋ 13๊ฐ์ง ์๋น์ค๋ฅผ Home Assistant ํ ๊ณณ์์ ๋ชจ๋ํฐ๋งํ ์ ์๊ฒ ํด์ฃผ๋ ํตํฉ ๊ตฌ์ฑ์์์
๋๋ค.
-
----
-
-## ๐ ์ฒ์์ด์ธ์? ์ด๋ ๊ฒ ๋ฐ๋ผ์ค์ธ์
-
-**์ด ์ปดํฌ๋ํธ๋ก ํ ์ ์๋ ์ผ์ ํ๋ง๋๋ก** โ ํ๊ตญ ๊ณต๊ณต ์๋น์ค(์ ๊ธฐยท์๋ยท๊ฐ์คยท๋ ์จยท์ฌ๋ยท์ฝ๊ตญยทํ๊ต ๊ธ์ ๋ฑ)์ ๋ฐ์ดํฐ๋ฅผ Home Assistant์ **์ผ์(sensor)ยท์ด๋ฒคํธ(event)ยท๋ ์จ(weather) ์ํฐํฐ**๋ก ๋ง๋ค์ด ์ค๋๋ค. ๋ง๋ค์ด์ง ์ํฐํฐ๋ ๋์๋ณด๋์ ํ์ํ๊ฑฐ๋, ์๋ํ์ ํธ๋ฆฌ๊ฑฐ๋ก ์ฐ๊ฑฐ๋, ์์ฑ๋น์(Assist)๋ก ๋ฌผ์ด๋ณผ ์ ์์ต๋๋ค.
-
-### ๐งญ ์ถ์ฒ ์ฝ๊ธฐ ์์
-
-| ์ํฉ | ์ถ์ฒ ์น์
|
-|---|---|
-| Home Assistant ์์ฒด๊ฐ ์ฒ์์ด๋ผ๋ฉด | [๊ณต์ ํ๊ตญ์ด ์์ ๊ฐ์ด๋](https://www.home-assistant.io/installation/) ๋จผ์ ๋ณธ ๋ค ๋์์ค์ธ์ |
-| HACS๊ฐ ๋ญ์ง ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด | [HACS๋?](#-hacs๊ฐ-์ฒ์์ด๋ผ๋ฉด) โ [์ค์น ๋ฐฉ๋ฒ](#-์ค์น-๋ฐฉ๋ฒ) |
-| **API ํค๋ถํฐ ๋ฐ์์ผ ํ๋์ง ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด** | [๐ 5๋ถ ๋ง์ ์์ํ๊ธฐ](#-5๋ถ-๋ง์-์์ํ๊ธฐ-api-ํค-ํ์-์์) (API ํค ์์ด ์์) |
-| ์ฝ๊ตญยท์ฌ๋๋ฌธ์ยท๊ธฐ์์ฒญ ๋ฑ ํค๊ฐ ํ์ํ ์๋น์ค | [๐ API ํค ๋ฐ๊ธ ๊ฐ์ด๋](#-api-ํค-๋ฐ๊ธ-๊ฐ์ด๋) |
-| ๋ง๋ค์ด์ง ์ํฐํฐ๋ก ์์ ์นด๋๋ฅผ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด | [๐จ ๋์๋ณด๋ ์์ ](#-๋์๋ณด๋-์์ ) |
-| ์ ๋๋ ๊ฒ ์์ผ๋ฉด | [โ ์์ฃผ ๋ฌป๋ ์ง๋ฌธ](#-์์ฃผ-๋ฌป๋-์ง๋ฌธ-faq) โ [๐ ๋ฌธ์ ํด๊ฒฐ](#-๋ฌธ์ -ํด๊ฒฐ) |
-
-> ๐ก **๋ชจ๋ ์๋น์ค๋ ๋ฌด๋ฃ**์
๋๋ค. ์ ๋ถยท๊ณต๊ณต๊ธฐ๊ด์ด ์ ๊ณตํ๋ ๋ฌด๋ฃ OpenAPI๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๋ณธ ์ปดํฌ๋ํธ๋ ๊ฒฐ์ ยท๊ณผ๊ธ์ด ์ผ์ ์์ต๋๋ค. ์ผ๋ถ ์๋น์ค(KEPCO/์๋ฆฌ์/๊ฐ์ค์ฑ)๋ ๋ณธ์ธ ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธํด์ผ ์์ ์ ์ฌ์ฉ๋์ ๋ณผ ์ ์์ต๋๋ค.
-
----
-
-## ๐ก ์ ๋ง๋ค์๋?
-
-๊ทธ๋์ ํ๊ตญ ์ฌ์ฉ์๊ฐ Home Assistant์ ์ฐ๋ํ๊ณ ์ถ์ ํ๊ตญ ์๋น์ค๋ค์ **์ฌ๋ฌ ์ฌ๋์ ๊ฐ๋ณ custom_component๋ก ํฉ์ด์ ธ ์์์ต๋๋ค** โ ํ์ ๋ฐ๋ก, ์๋ฆฌ์ ๋ฐ๋ก, ์์ ์๋ฆผ ๋ฐ๋ก, ์ฝ๊ตญ ๋ฐ๋ก, ํ๊ต ๊ธ์ ๋ฐ๋ก. ๊ฐ๊ฐ ์ค์น ๋ฐฉ์, ์ค์ ํ์, ์
๋ฐ์ดํธ ์ฃผ๊ธฐ, ์ธ์ฆ ์ฒ๋ฆฌ๊ฐ ์ ๊ฐ๊ฐ์ด๋ผ ๊ด๋ฆฌ๊ฐ ๋ฒ๊ฑฐ๋กญ๊ณ , ์ผ๋ถ๋ ์ ์ง๋ณด์๊ฐ ๋ฉ์ถ ์ฑ ๊นจ์ง๊ธฐ๋ ํฉ๋๋ค.
-
-๋ณธ ํ๋ก์ ํธ๋ **์ด ํฉ์ด์ง ํ๊ตญ ํตํฉ๋ค์ ํ๋์ ํจํค์ง๋ก ๋ฌถ์์ต๋๋ค** โ ๋จ์ผ HACS ๋ฑ๋ก, ๋จ์ผ config flow UI, ๋จ์ผ ์ฝ๋๋ฒ ์ด์ค. ์ ํ๊ตญ ์๋น์ค๊ฐ ํ์ํด์ง๋ฉด ์ฌ๊ธฐ์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
-
-๐ฌ๐ง English summary (click to expand)
+๐ฌ๐ง English summary
-A Home Assistant custom integration exposing 13 Korea-only public services as native entities (sensors, binary sensors, events, calendars, weather).
+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.
-**Supported services**
+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.
-| Category | Service | What it does |
-|---|---|---|
-| Utility | โก **KEPCO** (ํ๊ตญ์ ๋ ฅ) | Current usage, last/predicted monthly bill (login required) |
-| Utility | ๐ง **Arisu** (์์ธ์ ์์๋) | Seoul tap-water bill and usage |
-| Utility | ๐ **GasApp** (๊ฐ์ค์ฑ) | Monthly city-gas usage and bill (mobile-app token extraction required) |
-| Safety | ๐จ **Disaster Alert** (์ฌ๋๋ฌธ์) | Government emergency alerts, filtered by ์๋ (required) + ์๊ตฐ๊ตฌ (optional) |
-| Safety | ๐ข **Safety Alert** (์์ ์๋ฆผ์๋น์ค) | Region-based safety bulletins |
-| Safety | ๐ช๏ธ **Weather Warning** (๊ธฐ์ํน๋ณด) | KMA advisories/warnings as event entities |
-| Safety | ๐ **Earthquake** (์ง์ง) | Earthquake alerts with radius / minimum-magnitude filters |
-| Weather/Env | โ
**KMA Weather** (๊ธฐ์์ฒญ ๋๋ค์๋ณด) | Short-term + mid-term forecast as a native `weather` entity |
-| Weather/Env | ๐ซ๏ธ **AirKorea** (์์ด์ฝ๋ฆฌ์) | PM10/PM2.5/Oโ/NOโ/SOโ/CO + UV/heat/cold living indices |
-| Living | ๐ **Pharmacy** (์ฝ๊ตญ) | Pharmacies near you with hours and "open now" flag |
-| Living | โฝ **Fuel** (์ ๊ฐ) | Opinet province-level average prices and lowest-price stations |
-| Living | ๐ซ **School** (ํ๊ต) | NEIS school meals, academic calendar, class schedule |
-| Living | ๐ **Transit** (๋์ค๊ตํต) | Real-time subway and bus arrivals (Seoul + KakaoMap) |
-
-**Optional LLM integration** โ every service ships with an LLM tool so you can query it from a voice assistant or chat-style frontend in natural Korean (e.g. "์ง๊ธ ๋ฏธ์ธ๋จผ์ง ์ด๋?", "๊ฐ๊น์ด ์์
์ค ์ฝ๊ตญ ์๋ ค์ค").
-
-Aimed at Korean residents (and Korean expats) who want all of the above inside Home Assistant. Most providers do not publish official APIs, so several services use authenticated web scraping โ see the Disclaimer section.
-
-Installation and configuration details are in the Korean sections below.
+Optional LLM integration lets you ask in natural Korean ("์ง๊ธ ๋ฏธ์ธ๋จผ์ง ์ด๋?", "์ค๋ ๊ธ์ ๋ญ์ผ?") via HA's Assist conversation agent.
---
-## ๐ ์ง์ ์๋น์ค
-
-์ด **13๊ฐ์ง ์๋น์ค** ยท ์นดํ
๊ณ ๋ฆฌ๋ณ ์ ๋ฆฌ.
-๊ฐ ์๋น์ค ๋ฐ์ค์ **๐ ๋ฑ๋กํ๋ฉด ์๊ธฐ๋ ๊ฒ** ํญ๋ชฉ์ "์ด ํญ๋ชฉ์ ์ถ๊ฐํ์ ๋ ์ค์ ๋ก ์ด๋ค entity๊ฐ ๋ง๋ค์ด์ง๋์ง"๋ฅผ ๋ณด์ฌ์ค๋๋ค. *(์ํฐํฐ๋ช
์ ๋ฑ๋กํ ์ง์ญยท๊ณ์ ์ ๋ฐ๋ผ ์๋์ผ๋ก ๋ง๋ค์ด์ง๋ฉฐ ์๋ ์์์ ๋น์ทํ ํํ์
๋๋ค.)*
-
-### ๐ ์ํ ์ ํธ๋ฆฌํฐ
-
-#### โก ํ๊ตญ์ ๋ ฅ๊ณต์ฌ (KEPCO)
-- **์ ๋ ฅ ์ฌ์ฉ๋** ์ค์๊ฐ ๋ชจ๋ํฐ๋ง + **์๊ธ ์ ๋ณด**
-- ํ์ ํํ์ด์ง ID/๋น๋ฐ๋ฒํธ ์ธ์ฆ (API ํค โ, ๋ณธ์ธ ๊ณ์ ํ์)
-- **๐ ๋ฑ๋กํ๋ฉด ์๊ธฐ๋ ๊ฒ:** ๊ธฐ๊ธฐ `ํ์ (์ฌ์ฉ์ID)` ์๋์ ๋ค์ 5๊ฐ sensor โ
- - `๊ณ ๊ฐ๋ฒํธ`, `์ ๋ ฅ๊ตฌ๋ถ`, `์ง๋๋ฌ ์๊ธ` (์), `์์ ์๊ธ` (์), `ํ์ฌ ์ฌ์ฉ๋` (kWh)
-- **์ด๋ฐ ๋ถ๊ป ์ถ์ฒ:** ์์ ์๊ธ์ด ์ผ์ ๊ธ์ก์ ๋์ผ๋ฉด ์๋ฆผ์ ๋ฐ๊ณ ์ถ์ ๋ถ, ์ ์ฌ์ฉ๋ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๊ณ ์ถ์ ๋ถ
-- โ ๏ธ **์๋ ค์ง ํ๊ณ** โ ํ์ ํํ์ด์ง ํ์ด์ง๋ช
๋ณ๊ฒฝ ์ ๋ก๊ทธ์ธ ๊ฐ์ง ์คํจํ ์ ์์(2์ฐจ ์ธ์ฆ ๋ฏธ์ง์). ๋น์ ์ ์ HA ๋ก๊ทธ์ "KEPCO login: unknown redirect" ๋ฉ์์ง๋ก ํ์๋ฉ๋๋ค.
-
-#### ๐ง ์๋ฆฌ์ (์์ธ์ ์์๋)
-- **์๋์๊ธ** ๋ฐ ์ฌ์ฉ๋ ์กฐํ
-- **์์ฉ๊ฐ๋ฒํธ + ๊ณ ๊ฐ๋ช
** ๊ธฐ๋ฐ ์ธ์ฆ (API ํค โ, ์์ธ์ ๊ฑฐ์ฃผ์๋ง)
- - ์์ฉ๊ฐ๋ฒํธ๋ ์ข
์ด ๊ณ ์ง์ ๋๋ [์๋ฆฌ์ ์ฌ์ด๋ฒ ๊ณ ๊ฐ์ผํฐ](https://i-arisu.seoul.go.kr) ๋ก๊ทธ์ธ ํ `์๊ธ์กฐํ/๋ฉ๋ถ โ ์๋์๊ธ ์กฐํ` ํ๋ฉด ์ข์ธก์์ ํ์ธํ ์ ์์ต๋๋ค.
-- **๐ ๋ฑ๋กํ๋ฉด ์๊ธฐ๋ ๊ฒ:** ๊ธฐ๊ธฐ `์๋ฆฌ์ (์์ฉ๊ฐ๋ฒํธ)` ์๋์ sensor 3๊ฐ โ
- - `์๋ ์๊ธ` (์), `์ฌ์ฉ๋` (ใฅ), `์ฒญ๊ตฌ์`
-- **์ด๋ฐ ๋ถ๊ป ์ถ์ฒ:** ๊ฐ์กฑ ์ฌ์ฉ๋์ ๋งค์ ์ถ์ ํ๊ณ ์ถ์ ์์ธ ๊ฑฐ์ฃผ์
-- โ ๏ธ **์๋ ค์ง ํ๊ณ** โ ์์ธ์์ฒญ ํ์ด์ง(`i121.seoul.go.kr`) HTML ๊ตฌ์กฐ ๋ณ๊ฒฝ ์ ํ์ฑ ์คํจ ๊ฐ๋ฅ. 9์๋ฆฌ ์์ฉ๊ฐ๋ฒํธ ๊ฐ์ .
-
-#### ๐ ๊ฐ์ค์ฑ (๋์๊ฐ์ค)
-- **๊ฐ์ค ์ฌ์ฉ๋** ๋ฐ ์๊ธ ์กฐํ
-- **ํ ํฐ + ํ์ ID + ์ฌ์ฉ๊ณ์ฝ๋ฒํธ** ์ธ์ฆ (API ํค โ, ๊ฐ์ค์ฑ ๋ชจ๋ฐ์ผ ์ฑ ์ฌ์ฉ์)
-- **โ ๏ธ ์
๋ ฅ๊ฐ ์ถ์ถ์ด ๊น๋ค๋กญ์ต๋๋ค** โ ๊ฐ์ค์ฑ์ ๊ณต์ OpenAPI๊ฐ ์๋ ๋ชจ๋ฐ์ผ ์ฑ ๋ด๋ถ API๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, **์ฌ์ฉ๊ณ์ฝ๋ฒํธ** ์ธ์๋ ํจํท ์บก์ฒ๋ก ํ ํฐ์ ์ถ์ถํ๋ ๋ฐฉ์์
๋๋ค. ํจํท ์บก์ฒ๊ฐ ๋ถ๋ด์ค๋ฌ์ฐ๋ฉด ๋ค๋ฅธ ์๋น์ค๋ฅผ ๊ถ์ฅํฉ๋๋ค.
- - **์ฌ์ฉ๊ณ์ฝ๋ฒํธ** โ ๊ฐ์ค์ฑ ๋ชจ๋ฐ์ผ ์ฑ โ "๋ด ์ ๋ณด" โ ๋ฑ๋ก๋ ๊ณ์ฝ๋ฒํธ (๋๋ ๊ฐ์ค ๊ณ ์ง์์ ์ธ์)
- - **ํ ํฐ / ํ์ ID** โ ๊ฐ์ค์ฑ ๋ชจ๋ฐ์ผ ์ฑ์ HTTPS ์์ฒญ ํค๋ `X-Token`, `X-Member` ๊ฐ. mitmproxy/Charles ๊ฐ์ ๋๊ตฌ๋ก ์ถ์ถ
-- **๐ ๋ฑ๋กํ๋ฉด ์๊ธฐ๋ ๊ฒ:** ๊ธฐ๊ธฐ `๊ฐ์ค์ฑ (์ฌ์ฉ๊ณ์ฝ๋ฒํธ)` ์๋์ sensor 2๊ฐ โ
- - `์ฒญ๊ตฌ ์ ๋ชฉ`, `์ด ์๊ธ` (์)
-- **์ด๋ฐ ๋ถ๊ป ์ถ์ฒ:** ๋์ ๊ธฐ ๊ฐ์ค๋น ํญ์ฆ์ ๋ฏธ๋ฆฌ ์ก๊ณ ์ถ์ ๋ถ (๋จ, ์ถ์ถ ์์
๊ฐ๋ฅ์)
-
-### ๐จ ์์ ยท ์ฌ๋
-
-#### ๐ข ์ฌ๋๋ฌธ์ (ํ์ ์์ ๋ถ ์์ ๋ฐ์ดํฐํฌํธ)
-- **์ฌ๋๋ฌธ์** ์ค์๊ฐ ์์
-- **๊ด์ญ ์๋ (ํ์) + ์๊ตฐ๊ตฌ (์ ํ)** ๋จ์ ํํฐ๋ง โ config flow๊ฐ 17๊ฐ ๊ด์ญ dropdown + ์ ๊ตญ ์๊ตฐ๊ตฌ ํ๋ฉด dropdown ๋ ๋จ๊ณ๋ก ์ ๊ณต
-- **์์ ๋ฐ์ดํฐํฌํธ (`safetydata.go.kr`)** ์ธ์ฆํค ํ์ โ *๊ณต๊ณต๋ฐ์ดํฐํฌํธ๊ณผ ๋ค๋ฅธ ๋ณ๋ ํฌํธ์
๋๋ค*
-- **๐ ๋ฑ๋กํ๋ฉด ์๊ธฐ๋ ๊ฒ:** ๊ธฐ๊ธฐ `์ฌ๋๋ฌธ์ - <์ง์ญ>` ์๋์ โ
- - sensor `์ต์ ์ฌ๋๋ฌธ์` (state = ๊ฐ์ฅ ์ต๊ทผ ๋ฉ์์ง ๋ณธ๋ฌธ, attrs = `level`/`area`/`disaster_type`)
- - sensor `์ฌ๋๋ฌธ์ ์`
- - event `์ฌ๋๋ฌธ์ ์ด๋ฒคํธ` (์ ๋ฉ์์ง ๋์ฐฉ ์ ์๋ํ ํธ๋ฆฌ๊ฑฐ)
-- **์ด๋ฐ ๋ถ๊ป ์ถ์ฒ:** ํธ๋ํฐ ์๋ฆผ๊ณผ ๋ณ๊ฐ๋ก ๊ฑฐ์ค ํ๋ธ๋ฆฟ/ํ๋ธ์ ๋์ฐ๊ณ ์ถ์ ๋ถ, ํน์ ์ง์ญ(๋ถ๋ชจ๋ ๋ ๋ฑ)์ ๋ฐ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ์ถ์ ๋ถ
-
-#### ๐จ ์์ ์๋ฆผ์๋น์ค (ํ์ ์์ ๋ถ)
-- ์ง์ญ ๊ธฐ๋ฐ **์์ ์๋ฆผ bulletin** (`safekorea.go.kr` ํ์ด์ง ์ง์ ์คํฌ๋ํ)
-- **๋ณ๋ API ํค / ๋ณ๋ ํ์๊ฐ์
์์ด** ์ง์ญ๋ง ์ ํํ๋ฉด ์๋ โ
*(API ํค ์ ์ฒญ์ด ๋ถ๋ด์ค๋ฝ๋ค๋ฉด ์ฌ๊ธฐ์ ์์ํ์ธ์)*
-- **๐ ๋ฑ๋กํ๋ฉด ์๊ธฐ๋ ๊ฒ:** ๊ธฐ๊ธฐ `์์ ์๋ฆผ (<์ง์ญ๋ช
>)` ์๋์ โ
- - sensor `์ต์ ์์ ์๋ฆผ` (state = ์ต๊ทผ ๋ฉ์์ง ๋ณธ๋ฌธ, attrs = `latest`/`alerts[]`/`count`)
- - sensor `์์ ์๋ฆผ ์`
- - binary_sensor `์ค๋ ์์ ์๋ฆผ ์ฌ๋ถ`
- - event `์์ ์๋ฆผ ์ด๋ฒคํธ`
-- **์ด๋ฐ ๋ถ๊ป ์ถ์ฒ:** ์ฒ์ ์ปดํฌ๋ํธ๋ฅผ ์ฒดํํด๋ณด๊ณ ์ถ์ ๋ถ
-- โ ๏ธ **์๋ ค์ง ํ๊ณ** โ `safekorea.go.kr` HTML ๊ตฌ์กฐ ๋ณ๊ฒฝ ๋๋ TLS profile ๋ณ๊ฒฝ ์ ์ผ์ ๋ฏธ์๋ ๊ฐ๋ฅ. ์ปดํฌ๋ํธ ์ด์ ๋ฒ์ ์์ ๋ง๋ sensor 17๊ฐ ์นํ ์ด๋ฆ ํจํด (`์ต์ ์๋ฆผ ์ ํ/๋ด์ฉ/๋์์ง/์ผ์`, `์ง๋/์ง์ง๋ ์๋ฆผ...`)์ด ์๋ค๋ฉด ๋ฐ์ดํฐ schema๊ฐ ๋ฌ๋ผ์ง orphan ๊ฐ๋ฅ์ฑ โ entry ์ญ์ ํ ์ฌ๋ฑ๋ก ๊ถ์ฅ.
-
-#### ๐ช๏ธ ๊ธฐ์ํน๋ณด (๊ธฐ์์ฒญ)
-- **ํธ์ฐ / ๊ฐํ / ํํ / ํญ์ผ** ๋ฑ 12์ข
ํน๋ณด๋ฅผ `event` ์ํฐํฐ๋ก ๋
ธ์ถ
-- ํน๋ณด ๋ฐํจ / ํด์ / ์ฌ์ ์๊ณ ๋จ๊ณ๊น์ง ์ถ์
-- ๊ธฐ์์ฒญ **๊ธฐ์ํน๋ณด** ๋ฐ์ดํฐ์
ํ์ฉ์ ์ฒญ ํ์ (`data.go.kr`, ์ด์๊ธฐ๊ด ์ฝ๋ `1360000`, endpoint `WthrWrnInfoService`)
-- **๐ ๋ฑ๋กํ๋ฉด ์๊ธฐ๋ ๊ฒ:** ๊ธฐ๊ธฐ `๊ธฐ์ํน๋ณด - <์ง์ญ>` ์๋์ ํน๋ณด ์ข
๋ฅ๋ณ event ์ํฐํฐ 12๊ฐ โ
- - `ํธ์ฐ ํน๋ณด`, `๊ฐํ ํน๋ณด`, `ํํ ํน๋ณด`, `ํญ์ผ ํน๋ณด`, `๋์ค ํน๋ณด`, `ํฉ์ฌ ํน๋ณด`, `๊ฑด์กฐ ํน๋ณด`, `ํ๋ ํน๋ณด`, `ํญํํด์ผ ํน๋ณด`, `์ฐ๋๋ฏธ ํน๋ณด` ๋ฑ
- - ๊ฐ event์ state๋ `advisory`/`warning`/`pre_advisory`/`pre_warning`/`cancelled`/`none` ์ค ํ๋
-- **์ด๋ฐ ๋ถ๊ป ์ถ์ฒ:** ํญ์ผ ๊ฒฝ๋ณด๊ฐ ๋จ๋ฉด ์์ด์ปจ ์๋ ๊ฐ๋ ๊ฐ์ ์๋ํ๋ฅผ ๋ง๋ค๊ณ ์ถ์ ๋ถ
-
-#### ๐ ์ง์ง (๊ธฐ์์ฒญ)
-- **๋ฐ๊ฒฝ(km) + ์ต์ ๊ท๋ชจ(M)** ํํฐ๋ก ์๋ฆผ
-- ์/๊ฒฝ๋ ๊ธฐ์ค์ผ๋ก ๊ฑฐ๋ฆฌ ์๋ ๊ณ์ฐ
-- ๊ธฐ์์ฒญ **์ง์ง์ ๋ณด** ๋ฐ์ดํฐ์
ํ์ฉ์ ์ฒญ ํ์ (`data.go.kr`, ์ด์๊ธฐ๊ด ์ฝ๋ `1360000`, endpoint `EqkInfoService`)
-- โ ๏ธ **๊ธฐ๋ณธ ์ขํ๋ ์์ธ์์ฒญ (`37.5665`, `126.978`)** ์
๋๋ค. ์ฐ๋ฆฌ ์ง ์ขํ๋ก ๊ผญ ๋ฐ๊ฟ์ฃผ์ธ์. ๊ธฐ๋ณธ ๋ฐ๊ฒฝ์ 200km, ๊ธฐ๋ณธ ์ต์ ๊ท๋ชจ๋ 3.0 โ ์๋ฆผ์ ๋ ์ ๋ฐ๊ณ ์ถ์ผ๋ฉด ๋ฐ๊ฒฝโ/๊ท๋ชจโ๋ก ์กฐ์
-- **๐ ๋ฑ๋กํ๋ฉด ์๊ธฐ๋ ๊ฒ:** ๊ธฐ๊ธฐ `์ง์ง ์ ๋ณด` ์๋์ โ
- - event `์ง์ง ๊ฒฝ๋ณด` (state = ๊ฐ์ฅ ์ต๊ทผ ์ง์ง ์๊ฐ, ์ด๋ฒคํธ ๋ฐ์ ์ `magnitude`/`location`/`distance_km`/`datetime` ์ ๋ฌ)
- - ์ถ๊ฐ๋ก ์ง์ง๋ณ geolocation ์ํฐํฐ๊ฐ ์ง๋ ์นด๋์ ํ์ผ๋ก ํ์๋จ
-- **์ด๋ฐ ๋ถ๊ป ์ถ์ฒ:** ์ฐ๋ฆฌ ์ง์์ 100km ์ด๋ด ๊ท๋ชจ 3.0 ์ด์๋ง ์๋ฆผ ๋ฐ๊ณ ์ถ์ ๋ถ
-
-### โ
ํ๊ฒฝ ยท ๋ ์จ
-
-#### โ
๊ธฐ์์ฒญ ๋๋ค์๋ณด (KMA)
-- **๋จ๊ธฐ + ์ค๊ธฐ ์๋ณด**๋ฅผ native `weather` ์ํฐํฐ๋ก ๋
ธ์ถ
-- ์๋ โ ์๊ตฐ๊ตฌ ๋ค๋จ๊ณ ์ ํ, ๋ค์ค ์ง์ญ ๋์ ๋ฑ๋ก ๊ฐ๋ฅ
-- ์ต์
: Oโ / UV๋ ์ธ๊ทผ ์์ด์ฝ๋ฆฌ์ ์ธก์ ์ ์๋ ๋งค์นญ
-- ๊ธฐ์์ฒญ **๋จ๊ธฐ์๋ณด** ๋ฐ์ดํฐ์
ํ์ฉ์ ์ฒญ ํ์ (`data.go.kr`, ์ด์๊ธฐ๊ด ์ฝ๋ `1360000`, endpoint `VilageFcstInfoService_2.0`)
-- **๐ ๋ฑ๋กํ๋ฉด ์๊ธฐ๋ ๊ฒ:** ๊ธฐ๊ธฐ `๊ธฐ์์ฒญ ๋ ์จ์๋ณด - <์ง์ญ>` ์๋์ `weather` ์ํฐํฐ 1๊ฐ (HA ๊ธฐ๋ณธ Weather ์นด๋์ ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅ, hourly/daily forecast ์๋น์ค ์ง์)
-- **์ด๋ฐ ๋ถ๊ป ์ถ์ฒ:** HA ๊ธฐ๋ณธ ๋ ์จ ์นด๋๋ฅผ ํ๊ตญ ๊ธฐ์์ฒญ ๋ฐ์ดํฐ๋ก ์ฑ์ฐ๊ณ ์ถ์ ๋ถ
-
-#### ๐ซ๏ธ ์์ด์ฝ๋ฆฌ์ (AirKorea)
-- **PM10 / PM2.5 / Oโ / NOโ / SOโ / CO + ํตํฉ๋๊ธฐ์ง์ง์(KHAI)** ์๊ณ์ด
-- **์์ธ์ ์ง์ / ๋๊ธฐ์ ์ฒด์ง์** ๋ฑ ์ํ๊ธฐ์์ง์ ์ถ๊ฐ ๋ฑ๋ก ๊ฐ๋ฅ
-- ์ธก์ ์ ๋จ์ ๋ค์ค ๋ฑ๋ก
-- ํ๊ตญํ๊ฒฝ๊ณต๋จ **๋๊ธฐ์ค์ผ์ ๋ณด** + **์ธก์ ์์ ๋ณด** ๋ ๋ฐ์ดํฐ์
ํ์ฉ์ ์ฒญ ํ์ (`data.go.kr`, ์ด์๊ธฐ๊ด ์ฝ๋ `B552584`, endpoint `ArpltnInforInqireSvc` + `MsrstnInfoInqireSvc`)
-- (์ต์
) UV / ๋๊ธฐ์ ์ฒด sensor ์ถ๊ฐ ์ ๊ธฐ์์ฒญ **์ํ๊ธฐ์์ง์** ํ์ฉ์ ์ฒญ ํ์ โ โ ๏ธ V4/V5 ํธํ์ฑ ์ฃผ์, ์์ธํ ์๋ด๋ [์์ด์ฝ๋ฆฌ์ API ๊ฐ์ด๋ ์น์
](#-์์ด์ฝ๋ฆฌ์--ํ์-2๊ฑด--์ต์
-1๊ฑด) ์ฐธ๊ณ
-- **๐ ๋ฑ๋กํ๋ฉด ์๊ธฐ๋ ๊ฒ:** ์ธก์ ์๋ง๋ค ๊ธฐ๊ธฐ `์์ด์ฝ๋ฆฌ์ - <์ธก์ ์>` ๊ฐ ๋ง๋ค์ด์ง๊ณ , ๊ทธ ์๋์ โ
- - sensor `PM10 ๋ฏธ์ธ๋จผ์ง` ยท `PM2.5 ์ด๋ฏธ์ธ๋จผ์ง` ยท `SOโ ์ํฉ์ฐ๊ฐ์ค` ยท `CO ์ผ์ฐํํ์` ยท `Oโ ์ค์กด` ยท `NOโ ์ด์ฐํ์ง์` ยท `ํตํฉ๋๊ธฐ์ง์ง์`
- - binary_sensor `๋๊ธฐ์ง ๊ฒฝ๋ณด`, event `๋๊ธฐ์ง ๊ฒฝ๋ณด ์ด๋ฒคํธ`, calendar `๋๊ธฐ์ง ์๋ณด`
- - (์ํ์ง์ ํค ์
๋ ฅ ์) sensor `์์ธ์ ์ง์`, `๋๊ธฐ์ ์ฒด์ง์`
-- **์ด๋ฐ ๋ถ๊ป ์ถ์ฒ:** ๋ฏธ์ธ๋จผ์ง ์์น์ ๋ฐ๋ผ ํ๊ธฐ/๊ณต๊ธฐ์ฒญ์ ๊ธฐ ์๋ํ๋ฅผ ๋ง๋ค๊ณ ์ถ์ ๋ถ
-
-### ๐ ์ํ ์ ๋ณด
-
-#### ๐ ์ฝ๊ตญ (์ ๊ตญ ์ฝ๊ตญ ์ ๋ณด โ data.go.kr) โ
*์๋ ๊ฒ์ฆ ์๋ฃ*
-- **์๋/์๊ตฐ๊ตฌ๋ณ** ์ฝ๊ตญ ๋ชฉ๋ก๊ณผ ์์
์๊ฐ
-- `open_now` ๋์ ๊ณ์ฐ (์์ผยท์๊ฐ ๊ธฐ๋ฐ) โ ์ง๊ธ ์์
์ค์ธ์ง ์๋ ํ๋จ
-- ๊ฐ๊น์ด ์ ์ ๋ ฌ์ ์ธ ์ ์๋ ์ขํ attribute ํฌํจ
-- **๊ตญ๋ฆฝ์ค์์๋ฃ์_์ ๊ตญ ์ฝ๊ตญ ์ ๋ณด ์กฐํ ์๋น์ค** ํค ํ์ (`data.go.kr`, ์ด์๊ธฐ๊ด ์ฝ๋ B552657)
-- **๐ ๋ฑ๋กํ๋ฉด ์๊ธฐ๋ ๊ฒ:** ๊ธฐ๊ธฐ `์ฝ๊ตญ - <์๊ตฐ๊ตฌ or ์๋>` ์๋์ sensor `์ด์ ์ฝ๊ตญ ์` 1๊ฐ. attribute์ ๋ค์ ์ ๋ณด๊ฐ ๋ค์ด์์ด ๋์๋ณด๋์ฉ์ผ๋ก ํ๋ถ โ
- - `pharmacies[]` (์ต๋ 50๊ฐ; ๊ฐ ํญ๋ชฉ: `name`, `address`, `phone`, `today_hours`, `open_now`, `duty_time`, `lat`, `lon`)
- - `total` ยท `shown` ยท `open_now_count`
-- **์ด๋ฐ ๋ถ๊ป ์ถ์ฒ:** ์ผ์์ผยท๊ณตํด์ผ์ ๊ฐ๊น์ด ์์
์ฝ๊ตญ์ ํ๋์ ๋ณด๊ณ ์ถ์ ๋ถ, ์นด์นด์ค๋งต ๊ธธ์ฐพ๊ธฐ ์นด๋๋ฅผ ๋ง๋ค๊ณ ์ถ์ ๋ถ
-
-#### โฝ ์ ๊ฐ (Opinet)
-- **์๋ + ์ ์ข
**(ํ๋ฐ์ /๊ฒฝ์ /LPG/๊ณ ๊ธํ๋ฐ์ /๋ฑ์ )๋ณ ํ๊ท ๊ฐยท์ต์ ๊ฐ
-- ์๋ ๋ด **์ต์ ๊ฐ ์ฃผ์ ์ Top 5 ๋ญํน** attribute
-- Opinet API ํค ํ์ (`opinet.co.kr`)
-- **๐ ๋ฑ๋กํ๋ฉด ์๊ธฐ๋ ๊ฒ:** ๋ฑ๋กํ (์๋ ร ์ ์ข
) ์กฐํฉ๋ง๋ค ๊ธฐ๊ธฐ `์ ๊ฐ์ ๋ณด - <์ง์ญ> <์ ์ข
>` ์๋์ sensor 2๊ฐ โ
- - `์ ๊ตญ ํ๊ท ๊ฐ` (์/L)
- - `์ต์ ๊ฐ` (์/L) โ attrs: `station_name`, `address`, `ranking[]` (์์ 5๊ฐ ์ฃผ์ ์ ์ด๋ฆยท๊ฐ๊ฒฉยท์ฃผ์)
-- **์ด๋ฐ ๋ถ๊ป ์ถ์ฒ:** ์ถํด๊ทผ ๋์ ์์ ์ต์ ๊ฐ ์ฃผ์ ์๋ฅผ ์๋์ผ๋ก ์ถ์ฒ๋ฐ๊ณ ์ถ์ ๋ถ
-
-#### ๐ซ ํ๊ต (NEIS โ ๋์ด์ค ๊ต์ก์ ๋ณด ๊ฐ๋ฐฉ ํฌํธ)
-- **ํ๊ต ์ ๋ณด + ๊ธ์ + ํ์ฌ์ผ์ + ์๊ฐํ** ์ข
ํฉ
-- **NEIS ๊ต์ก์ ๋ณด ๊ฐ๋ฐฉ ํฌํธ** API ํค ํ์ (`open.neis.go.kr`)
-- **์ค์ ํ๋ฆ** *(์ ๋ถ GUI ๋จ๊ณ๋ณ ์๋ด)*:
- 1. API ํค + ํ๊ต ๊ธ(์ด/์ค/๊ณ /ํน์) ์ ํ
- 2. ํ๊ต๋ช
์
๋ ฅ (์: "ํ์์ด") โ ์๋์ผ๋ก ๊ฒ์ ๊ฒฐ๊ณผ dropdown ํ์ (์ต๋ 10๊ฐ) โ ์ ํ
- 3. ํ๋
-๋ฐ ๋ฉํฐ ์ ํ (์: `2ํ๋
3๋ฐ`, `2ํ๋
4๋ฐ` ๋์ ๋ฑ๋ก ๊ฐ๋ฅ)
- 4. 1~7๊ต์ + ์ ์ฌ ์๊ฐ ์
๋ ฅ
- - ์๋
๊ฐ ๋ ์ด์์ด๋ฉด ๊ฐ์ ํ๋ฆ์ ํ๊ต๋ง๋ค ๋ฐ๋ณต ๋ฑ๋ก ๊ฐ๋ฅ
-- **๐ ๋ฑ๋กํ๋ฉด ์๊ธฐ๋ ๊ฒ:** ๊ธฐ๊ธฐ `<ํ๊ต๋ช
>` ์๋์ โ
- - sensor `๊ธ์` (state = ์ค๋ ๊ธ์ ๋ฉ๋ด ์ผํ ๊ตฌ๋ถ, attrs: `menu`, `calorie`, `allergy_codes`)
- - sensor `ํ๊ต ์ ๋ณด` (state = ํ๊ต๋ช
, attrs: ํ๋
ยท๋ฐยท์ฃผ์ยท์ ํ)
- - ์ถ๊ฐ๋ก ํ์ฌ์ผ์ /์๊ฐํ calendar ์ํฐํฐ
-- **์ด๋ฐ ๋ถ๊ป ์ถ์ฒ:** ์์นจ์ ์๋
์๊ฒ "์ค๋ ๊ธ์ ๋ญ์ผ?" ์์ฑ ์๋ต์ ์ํค๊ณ ์ถ์ ๋ถ
-- โ ๏ธ **์๋ ค์ง ํ๊ณ** โ NEIS๋ ๋ฐ์ดํฐ ์๋ ๋ ์ง์ `INFO-200` ์๋ต์ ๋ณด๋ด๋๋ฐ ํ์ฌ ์ฝ๋๋ ์ด๊ฒ๋ ์๋ฌ๋ก ์ฒ๋ฆฌ. ๋ฐฉํยทํด์ผ ๋ฑ ๋น ๋ ์ง์ ์ผ์ ์๋ฌ ๋ก๊ทธ๊ฐ ๋จ์ ์ ์์ต๋๋ค.
-
-#### ๐ ๋์ค๊ตํต (Transit)
-- **์งํ์ฒ ์ค์๊ฐ ๋์ฐฉ์ ๋ณด** (์์ธ ์ด๋ฆฐ๋ฐ์ดํฐ๊ด์ฅ)
-- **๋ฒ์ค ์ค์๊ฐ ๋์ฐฉ์ ๋ณด** (์นด์นด์ค๋งต ๋น๊ณต์ endpoint) โ ํค ๋ถํ์
-- (์ต์
) **ํ์น๊ฒฝ๋ก ๊ฒ์** (์์ธ์ ํ์น๊ฒฝ๋ก API) โ ๋ณ๋ ํค ํ์
-- TIMESTAMP ๊ธฐ๋ฐ ๋์ฐฉ sensor โ ๋ฑ๋กํ ์ญ/์ ๋ฅ์ฅ๋ง๋ค ๋ค์ 2๋๊น์ง ํ์
-- **ํ์ํ ํค โ ์ฌ์ฉ ์๋๋ฆฌ์ค๋ณ๋ก ๋ค๋ฆ:**
- - ์งํ์ฒ ๋์ฐฉ์ ๋ณด๋ง โ ์์ธ ์ด๋ฆฐ๋ฐ์ดํฐ๊ด์ฅ ํค 1๊ฐ
- - ๋ฒ์ค ๋์ฐฉ์ ๋ณด๋ง โ **ํค ๋ถํ์** (์นด์นด์ค๋งต ์ ๋ฅ์ฅ ID๋ง ์
๋ ฅ)
- - ํ์น๊ฒฝ๋ก ๊ฒ์๊น์ง โ ์์ธ์ ํ์น๊ฒฝ๋ก API ํค ์ถ๊ฐ (config_flow์์ `bus_api_key` Optional ์
๋ ฅ)
-- **์ค์ ํ๋ฆ**:
- 1. ๋ API ํค ์
๋ ฅ
- 2. ๋ฉ๋ด์์ "์งํ์ฒ ์ญ ์ถ๊ฐ" ๋๋ "๋ฒ์ค ๋
ธ์ ์ถ๊ฐ" ์ ํ
- 3. **์งํ์ฒ ** โ ์ญ ์ด๋ฆ + ๋ฐฉํฅ(์ํ/ํํ) + ํธ์ ํํฐ
- 4. **๋ฒ์ค** โ ์นด์นด์ค๋งต ์ ๋ฅ์ฅ ID ์
๋ ฅ โ ํด๋น ์ ๋ฅ์ฅ์ ์ ์ฐจํ๋ ๋
ธ์ ๋ค์ด ์๋์ผ๋ก ํ์ โ ์ถ์ ํ ๋
ธ์ ๋ฉํฐ ์ ํ
-- ๐ **์นด์นด์ค๋งต ์ ๋ฅ์ฅ ID ์ฐพ๋ ๋ฒ** โ PC์์ [์นด์นด์ค๋งต](https://map.kakao.com) ์ ์ โ ์ ๋ฅ์ฅ ์ด๋ฆ ๊ฒ์ โ ์ ๋ฅ์ฅ์ ํด๋ฆญํ๋ฉด URL์ด `https://map.kakao.com/?busstopid=03171&...` ํํ๋ก ๋ฐ๋๋๋ฐ, **`busstopid=` ๋ค์ ๊ฐ**(์: `03171`, `BS09013700`, `223000122` ๋ฑ)์ ๋ณต์ฌํด์ ์
๋ ฅ
-- **๐ ๋ฑ๋กํ๋ฉด ์๊ธฐ๋ ๊ฒ:** ์งํ์ฒ ์ ์ญยท๋ฐฉํฅ๋ณ ๊ธฐ๊ธฐ ์๋์ ๋์ฐฉ sensor 2๊ฐ(์ฒซ ์ฐจ/๋ค์ ์ฐจ), ๋ฒ์ค ์ ๋ฅ์ฅ์ ๋
ธ์ ๋ณ๋ก ๋์ฐฉ sensor 2๊ฐ. state๋ ๋์ฐฉ ์๊ฐ timestamp (HA๊ฐ ์๋์ผ๋ก "N๋ถ ํ"๋ก ํ์)
-- **์ด๋ฐ ๋ถ๊ป ์ถ์ฒ:** "๋ค์ ๋ฒ์ค 5๋ถ ํ ๋์ฐฉํ๋ฉด ์ฐ์ฐ ์๋ฆผ" ๊ฐ์ ์๋ํ๋ฅผ ๋ง๋ค๊ณ ์ถ์ ๋ถ
-
-> ๐ **entity_id ํ๊ธฐ ์๋ด** โ ์ ๋ฐ์ค์ "sensor `์ด๋ฆ`" ํํ๋ HA์์ ํ์๋๋ **์นํ ์ด๋ฆ(friendly name)** ์
๋๋ค. ์ค์ entity_id๋ HA๊ฐ ๋๋ฐ์ด์ค๋ช
ยท์ํฐํฐ๋ช
์ ํ๊ธโ๋ก๋ง์ ์ฌ๋ฌ๊ทธํํด์ ์๋ ์์ฑํ๋ฏ๋ก(์: `sensor.yaggug_gangnamgu_unyeong_yaggug_su`), ์ ํํ ID๋ **๊ฐ๋ฐ์ ๋๊ตฌ โ ์ํ**์์ ์นํ ์ด๋ฆ์ผ๋ก ๊ฒ์ํด ํ์ธํ์ธ์. UI์์ ์์ ๋กญ๊ฒ entity_id๋ฅผ ๋ ์ง๊ด์ ์ธ ์ด๋ฆ์ผ๋ก ๋ณ๊ฒฝํ ์๋ ์์ต๋๋ค.
+## ๐ 5๋ถ ๋ง์ ์์ํ๊ธฐ
----
-
-## ๐ 5๋ถ ๋ง์ ์์ํ๊ธฐ (API ํค ํ์ ์์)
-
-์ฒ์์ด๋ผ **๋ญ๊ฐ ๋๋์ง ์ผ๋จ ํ์ธํด๋ณด๊ณ ์ถ์ผ์๋ฉด** ์๋ ์์๋๋ก ๋ฐ๋ผ์ค์ธ์. API ํค ์ ์ฒญ ์์ด 5๋ถ์ด๋ฉด ์ฒซ sensor๊ฐ ๋ง๋ค์ด์ง๋๋ค.
-
-### Step 1. ์ปดํฌ๋ํธ ์ค์น (2๋ถ)
+### โ ์ปดํฌ๋ํธ ์ค์น (2๋ถ)
-์์ชฝ์ **`MY` HACS ์ํด๋ฆญ ๋ฒํผ**์ ๋๋ฅด์ธ์. ์ ๋ณด์ด๋ฉด [HACS ์ค์น ๋ฐฉ๋ฒ](#-์ค์น-๋ฐฉ๋ฒ) ์ฐธ๊ณ .
+์ **`MY` HACS ๋ฑ์ง**๋ฅผ ๋๋ฅด๋ฉด ์๋์ผ๋ก HA๊ฐ ์ด๋ฆฝ๋๋ค โ **DOWNLOAD** โ **์ฌ์์**.
+*HACS๊ฐ ์์ผ์๋ค๋ฉด โ [HACS ๊ณต์ ์ค์น ๊ฐ์ด๋](https://www.hacs.xyz/docs/setup/download/) ๋จผ์ .*
-### Step 2. ์์ ์๋ฆผ ๋ฑ๋ก (1๋ถ) โ **API ํค ๋ถํ์**
+### โก ์ฒซ ์๋น์ค ๋ฑ๋ก (1๋ถ) โ API ํค โ **๋ถํ์**
-1. **์ค์ โ ๊ธฐ๊ธฐ ๋ฐ ์๋น์ค โ ํตํฉ ๊ตฌ์ฑ์์ ์ถ๊ฐ**
-2. ๊ฒ์์ฐฝ์ **`ํ๊ตญ ์ปดํฌ๋ํธ ํคํธ`** ์
๋ ฅ *(์๋ฌธ ๋๋ฉ์ธ๋ช
`kr_component_kit` ์ผ๋ก๋ ๊ฒ์๋ฉ๋๋ค)*
-3. 13๊ฐ ์๋น์ค ๋ฉ๋ด ์ค **๐จ ์์ ์๋ฆผ** ์ ํ
-4. ์๋/์๊ตฐ๊ตฌ dropdown์์ ํ ๊ณณ ์ด์ ์ ํ โ **์ ์ถ**
+**์ค์ โ ๊ธฐ๊ธฐ ๋ฐ ์๋น์ค โ + ํตํฉ ๊ตฌ์ฑ์์ ์ถ๊ฐ**
+โ ๊ฒ์์ฐฝ์ `ํ๊ตญ ์ปดํฌ๋ํธ ํคํธ` *(์๋ฌธ ๋๋ฉ์ธ `kr_component_kit` ๋ ๊ฐ๋ฅ)*
+โ **๐จ ์์ ์๋ฆผ** ์ ํ โ ์๋/์๊ตฐ๊ตฌ/์๋ฉด๋ ์ ํ โ ์ ์ถ
-### Step 3. ๊ฒฐ๊ณผ ํ์ธ (30์ด)
+### โข ๊ฒฐ๊ณผ ํ์ธ (30์ด)
-**๊ฐ๋ฐ์ ๋๊ตฌ โ ์ํ** ์ฐฝ์ ์ด๊ณ ์นํ ์ด๋ฆ์ผ๋ก `์ต์ ์์ ์๋ฆผ` ์ ๊ฒ์ํ์ธ์ โ ๋ฑ๋กํ ์ง์ญ๋ง๋ค ํ๋์ฉ ์กํ๋๋ค. ํด๋ฆญํ๋ฉด ์๋ ์์ฑ๋ entity_id(์: `sensor.anjeon_allim_seoul_teugbyeolsi_choesin_anjeon_allim`)์ state(๊ฐ์ฅ ์ต๊ทผ ํ์๋ถ ์์ ๋ฉ์์ง) ๊ฐ ๋ณด์
๋๋ค. ๋์๋ณด๋์๋ ๋ค์ ํ ์ค๋ก ํ์ โ
-
-> ๐ **"๊ฐ๋ฐ์ ๋๊ตฌ" ์์น** โ HA ์ฌ์ด๋๋ฐ ํ๋จ์ ๐ ๏ธ ๋ง์น ์์ด์ฝ. ์ฌ์ด๋๋ฐ๊ฐ ์ ํ์๋ค๋ฉด ์ข์ธก ์ โฐ ๋ฉ๋ด โ ๊ฐ๋ฐ์ ๋๊ตฌ. (๊ด๋ฆฌ์ ๊ณ์ ์์๋ง ๋ณด์
๋๋ค.)
-
-```yaml
-type: entity
-entity: sensor.
-```
+**๊ฐ๋ฐ์ ๋๊ตฌ โ ์ํ** ์์ ์นํ ์ด๋ฆ `์ต์ ์์ ์๋ฆผ` ๊ฒ์ โ state์ ๊ฐ์ฅ ์ต๊ทผ ํ์๋ถ ์์ ๋ฉ์์ง ํ์.
-> ๐ก entity_id๊ฐ ๊ธธ๊ณ ํท๊ฐ๋ฆฌ๋ฉด **์ค์ โ ๊ธฐ๊ธฐ ๋ฐ ์๋น์ค โ "ํ๊ตญ ์ปดํฌ๋ํธ ํคํธ" โ ํด๋น ์์ ์๋ฆผ ์นด๋ โ ์ํฐํฐ ํด๋ฆญ โ ์ค์ (โ๏ธ)** ์์ ๋ ์งง์ ์ด๋ฆ์ผ๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค (์: `sensor.safety_alert_gangnam`).
+### โฃ ๋ ๋ง์ ์๋น์ค ์ถ๊ฐ
-### Step 4. ๋ง์์ ๋ค๋ฉด ์ถ๊ฐ ๋ฑ๋ก
-
-๊ฐ์ ํตํฉ ๊ตฌ์ฑ์์์์ **"ํญ๋ชฉ ์ถ๊ฐ"** ๋ฅผ ๋๋ฌ ์ฝ๊ตญยท๊ธฐ์์ฒญยท์ฌ๋๋ฌธ์ยทํ๊ต ๋ฑ์ ํ๋์ฉ ๋ ๋ฑ๋กํ์ธ์. ์ด๋ ๋น๋ก์ API ํค๊ฐ ํ์ํด์ง๋๋ค โ [๐ API ํค ๋ฐ๊ธ ๊ฐ์ด๋](#-api-ํค-๋ฐ๊ธ-๊ฐ์ด๋)๋ก ์ด๋.
+์ค๋น๋์๋ฉด [๐ API ํค ๋ฐ๊ธ ๊ฐ์ด๋](#-api-ํค-๋ฐ๊ธ-๊ฐ์ด๋)๋๋ก ๋ค๋ฅธ 12๊ฐ๋ฅผ ํ๋์ฉ ์ถ๊ฐํ์๋ฉด ๋ฉ๋๋ค.
---
-## ๐ค LLM API ์ฐ๋ (์ต์
)
-
-๊ฐ ์๋น์ค๋ ๋์ผํ ์ด๋ฆ์ **LLM ๋๊ตฌ**๋ฅผ ํจ๊ป ๋ฑ๋กํฉ๋๋ค. Home Assistant์ **Assist + LLM ํตํฉ**(OpenAI / Google / Ollama ๋ฑ)์ ๋ณธ ํตํฉ์ ๋
ธ์ถํ๋ฉด ์์ฐ์ด๋ก ์ง์ ์ง์ํ ์ ์์ต๋๋ค.
-
-| ์๋น์ค | ์์ฐ์ด ์์ |
-|---|---|
-| ์ฝ๊ตญ | "์ง๊ธ ์์
์ค์ธ ๊ฐ๊น์ด ์ฝ๊ตญ ์๋ ค์ค" |
-| ์์ด์ฝ๋ฆฌ์ | "์ค๋ ๋ฏธ์ธ๋จผ์ง ์ด๋?" |
-| ๊ธฐ์์ฒญ | "๋ด์ผ ๋น ์?" |
-| ์ฌ๋๋ฌธ์ | "์ต๊ทผ ์ฌ๋๋ฌธ์ ๋ญ ์์ด?" |
-| ์ง์ง | "์ต๊ทผ ์ง์ง ์์์ด?" |
-| ํ๊ต | "์ค๋ ๊ธ์ ๋ญ์ผ?" |
-| ์ ๊ฐ | "์ฐ๋ฆฌ ๋๋ค ํ๋ฐ์ ์ต์ ๊ฐ ์ด๋์ผ?" |
-| ๋์ค๊ตํต | "๋ค์ ๋ง์๋ฒ์ค ์ธ์ ์?" |
+## ๐ 13๊ฐ์ง ์๋น์ค ํ๋์
-LLM์์ ๋ณธ ํตํฉ์ ๋
ธ์ถํ์ง ์์ผ๋ฉด ๊ทธ๋ฅ ์ผ๋ฐ sensor/event/weather ์ํฐํฐ๋ก๋ง ๋์ํฉ๋๋ค. ์ถ๊ฐ ์ค์ ๋ถํ์.
+| ์๋น์ค | ์นดํ
๊ณ ๋ฆฌ | 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๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฒฐ์ ยท๊ณผ๊ธ ์ผ์ ์์.
---
-## ๐ ์ค์น ๋ฐฉ๋ฒ
-
-### ๐ฏ HACS๊ฐ ์ฒ์์ด๋ผ๋ฉด
-
-**HACS(Home Assistant Community Store)** ๋ ๊ณต์ ํตํฉ์๋ ์๋ ์ฌ์ฉ์ ์ ์ ์ปดํฌ๋ํธ๋ฅผ GUI๋ก ์ค์นยท์
๋ฐ์ดํธํ ์ ์๊ฒ ํด์ฃผ๋ ๋ถ๊ฐ ๋๊ตฌ์
๋๋ค. ํ๊ตญ ์๋น์ค์ฒ๋ผ ๊ณต์์ ์๋ ํตํฉ์ ์ฐ๋ ค๋ฉด ๊ฑฐ์ ํ์์
๋๋ค.
-
-- HACS ์์ฒด ์ค์น๊ฐ ์ ๋์ด ์๋ค๋ฉด โ [HACS ๊ณต์ ์ค์น ๊ฐ์ด๋](https://www.hacs.xyz/docs/setup/download/) ๋จผ์ ์งํ (5~10๋ถ)
-- ์ด๋ฏธ HACS๊ฐ ์๋ค๋ฉด โ ์๋ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํ๋๋ฅผ ๊ณ ๋ฅด์ธ์
-
-> โน๏ธ ๋ณธ ์ปดํฌ๋ํธ๋ ํ์ฌ **HACS ์ฌ์ฉ์ ์ง์ ๋ฆฌํฌ์งํ ๋ฆฌ(Custom Repository)** ๋ก ์ค์นํฉ๋๋ค. HACS Default ๋ฑ๋ก์ ์งํ ์ค์ด๋ฉฐ, ๋ฑ๋ก์ด ์๋ฃ๋๋ฉด ๋ณ๋์ ๋ฆฌํฌ์งํ ๋ฆฌ ์ถ๊ฐ ์์ด HACS ๊ฒ์๋ง์ผ๋ก ์ค์นํ ์ ์๊ฒ ๋ฉ๋๋ค.
-
-### ๋ฐฉ๋ฒ A. **์ํด๋ฆญ ์ค์น** (๊ฐ์ฅ ๋น ๋ฆ)
-
-ํ์ด์ง ์๋จ์ **`MY` ๋ฑ์ง**๋ฅผ ๋๋ฅด๋ฉด ์์ ์ Home Assistant๊ฐ ์๋์ผ๋ก ์ด๋ฆฌ๋ฉฐ HACS ๋ฑ๋ก ํ๋ฉด์ผ๋ก ์ด๋ํฉ๋๋ค. **DOWNLOAD** ํด๋ฆญ โ **Home Assistant ์ฌ์์** ๋ง ํ๋ฉด ๋.
-
-> ๐ [์ํด๋ฆญ ์ค์น ๋งํฌ](https://my.home-assistant.io/redirect/hacs_repository/?owner=redchupa&repository=kr_component_kit&category=integration)
-
-### ๋ฐฉ๋ฒ B. HACS ์์์ ์๋ ๋ฑ๋ก
+## ๐ API ํค ๋ฐ๊ธ ๊ฐ์ด๋
-1. Home Assistant ์ฌ์ด๋๋ฐ โ **HACS**
-2. ์ฐ์ธก ์๋จ **โฎ** (์ 3๊ฐ) ๋ฉ๋ด โ **์ฌ์ฉ์ ์ง์ ๋ฆฌํฌ์งํ ๋ฆฌ (Custom repositories)**
-3. ๋ค์ ์ ๋ณด ์
๋ ฅ:
- - **๋ฆฌํฌ์งํ ๋ฆฌ:** `redchupa/kr_component_kit`
- - **์นดํ
๊ณ ๋ฆฌ(ํ์
):** `Integration`
-4. **์ถ๊ฐ** ํด๋ฆญ โ HACS ๊ฒ์์์ **KR Component Kit** ๊ฒ์ โ **DOWNLOAD**
-5. **์ค์ โ ์์คํ
โ ๋ค์ ์์** ์ผ๋ก Home Assistant ์ฌ์์
+> โ ๏ธ **์์ฃผ ๋ฐ์ํ๋ ์ค์ 3๊ฐ์ง**
+> - ์ฌ๋๋ฌธ์๋ `safetydata.go.kr` (์์ ๋ฐ์ดํฐํฌํธ) โ `data.go.kr` (๊ณต๊ณต๋ฐ์ดํฐํฌํธ) ๊ณผ **๋ค๋ฅธ ํฌํธ**. ๊ณ์ ยทํค ๋ถ๋ฆฌ.
+> - ๊ฐ์ `data.go.kr` ์์์๋ **๋ฐ์ดํฐ์
๋ง๋ค ํ์ฉ์ ์ฒญ์ ๋ฐ๋ก** โ ์ฝ๊ตญ ์ ์ฒญ ํค๋ก ๊ธฐ์ํน๋ณด ํธ์ถํ๋ฉด 403.
+> - ์ ์ฒญ ์งํ ํ์ฑํ๊น์ง **1~2์๊ฐ** ๊ฑธ๋ฆด ์ ์์ (ํนํ ์ด์๊ธฐ๊ด ํค).
-### ๋ฐฉ๋ฒ C. HACS ์์ด ์๋ ์ค์น (๋น์ถ์ฒ)
+๊ฐ ์๋น์ค์ *๋ฐ๋ก ๊ฒ์ ๋งํฌ*๋ ํด๋ฆญ ํ ๋ฒ์ ํด๋น ํฌํธ ๊ฒ์ ๊ฒฐ๊ณผ ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค (๋ธ๋ผ์ฐ์ ๊ฐ ํ๊ตญ์ด ์๋ ์ธ์ฝ๋ฉ).
-HACS๋ฅผ ๋ชป ์ฐ๋ ํ๊ฒฝ์์๋ง ์ฌ์ฉํ์ธ์. ์ด ๋ฐฉ๋ฒ์ **์๋ ์
๋ฐ์ดํธ๊ฐ ์ ๋ฉ๋๋ค.**
+### ๐ ์ฝ๊ตญ (์ ๊ตญ ์ฝ๊ตญ ์ ๋ณด)
-1. ์ด ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ZIP์ผ๋ก ๋ค์ด๋ก๋ โ ์์ถ ํด์
-2. `custom_components/kr_component_kit` ํด๋ ์ ์ฒด๋ฅผ Home Assistant `config/custom_components/` ์์ ๋ณต์ฌ
-3. Home Assistant ์ฌ์์
+| ํญ๋ชฉ | ๊ฐ |
+|---|---|
+| ๐ ํฌํธ | [๊ณต๊ณต๋ฐ์ดํฐํฌํธ (data.go.kr)](https://www.data.go.kr) |
+| ๐ ๋ฐ๋ก ๊ฒ์ | [๐ ์ ๊ตญ ์ฝ๊ตญ ๊ฒ์ ๊ฒฐ๊ณผ๋ก ์ด๋](https://www.data.go.kr/tcs/dss/selectDataSetList.do?searchKeyword=์ ๊ตญ%20์ฝ๊ตญ) |
+| ๊ฒ์์ด | `์ ๊ตญ ์ฝ๊ตญ` ๋๋ `์ฝ๊ตญ ์ ๋ณด` |
+| ์ด์๊ธฐ๊ด | ๊ตญ๋ฆฝ์ค์์๋ฃ์ (์ฝ๋ `B552657`) |
+| ์ ํํ ๋ฐ์ดํฐ์
๋ช
| **๊ตญ๋ฆฝ์ค์์๋ฃ์_์ ๊ตญ ์ฝ๊ตญ ์ ๋ณด ์กฐํ ์๋น์ค** |
+| ์ฝ๋ ํธ์ถ endpoint | `apis.data.go.kr/B552657/ErmctInsttInfoInqireService/getParmacyListInfoInqire` |
-> โ
์ค์น ํ์ธ: ์ฌ์์ ํ **์ค์ โ ๊ธฐ๊ธฐ ๋ฐ ์๋น์ค โ ํตํฉ ๊ตฌ์ฑ์์ ์ถ๊ฐ** ์์ `ํ๊ตญ ์ปดํฌ๋ํธ ํคํธ` ๊ฐ ๊ฒ์๋๋ฉด ์ฑ๊ณต์
๋๋ค. *(HA ๊ฒ์์ ํ๊ธ ์
๋ ฅ ๊ฐ๋ฅ โ ์ ๋๋ฉด ์๋ฌธ ๋๋ฉ์ธ `kr_component_kit` ์ผ๋ก๋ ๊ฒ์๋ฉ๋๋ค.)*
+**์ ์ฒญ ๋จ๊ณ:** ํ์๊ฐ์
โ ์ ๊ฒ์ ๋งํฌ ํด๋ฆญ โ ๋ฐ์ดํฐ์
์ ํ โ **ํ์ฉ์ ์ฒญ** โ ๋ง์ดํ์ด์ง โ ์คํAPI โ ์ธ์ฆํค ๋ฐ๊ธํํฉ โ **์ผ๋ฐ ์ธ์ฆํค(Decoding)** ๋ณต์ฌ โ HA ์ฝ๊ตญ ํญ๋ชฉ์ ๊ทธ๋๋ก ๋ถ์ฌ๋ฃ๊ธฐ.
---
-## โ๏ธ ์ค์ ๋ฐฉ๋ฒ
+### ๐ข ์ฌ๋๋ฌธ์
-### ๊ธฐ๋ณธ ํ๋ฆ
-
-1. **์ค์ โ ๊ธฐ๊ธฐ ๋ฐ ์๋น์ค**
-2. ์ฐ์ธก ํ๋จ **+ ํตํฉ ๊ตฌ์ฑ์์ ์ถ๊ฐ** ํด๋ฆญ
-3. ๊ฒ์์ฐฝ์ **`ํ๊ตญ ์ปดํฌ๋ํธ ํคํธ`** ์
๋ ฅ โ ์ ํ *(ํ๊ธ ํค๋ณด๋๊ฐ ์๋๋ฉด ์๋ฌธ ๋๋ฉ์ธ๋ช
`kr_component_kit` ์ผ๋ก๋ ๊ฒ์๋ฉ๋๋ค)*
-4. **13๊ฐ์ง ์๋น์ค ์ค ํ๋** ๋ฅผ ๊ณ ๋ฅธ ๋ค โ ์๋ด ํ๋ฉด์ ๋ฐ๋ผ ํ์ํ ์ ๋ณด ์
๋ ฅ โ ์๋ฃ
-5. ๋ค๋ฅธ ์๋น์ค๋ฅผ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด, **์ด๋ฏธ ๋ฑ๋ก๋ "ํ๊ตญ ์ปดํฌ๋ํธ ํคํธ" ์นด๋ ์์ "+ ํญ๋ชฉ ์ถ๊ฐ" ๋ฒํผ** ์ ๋๋ฅด์ธ์ (๋๋ ์นด๋์ โฎ โ ํญ๋ชฉ ์ถ๊ฐ)
-6. ๋ฑ๋ก ํ์ **API ํค๋ง ๋ฐ๊พธ๊ณ ์ถ๋ค๊ฑฐ๋ ์ง์ญ์ ์ถ๊ฐ**ํ๊ณ ์ถ์ ๋๋ ํด๋น ํญ๋ชฉ์ **"๊ตฌ์ฑ"** ๋ฒํผ์ ๋๋ฅด๋ฉด ์
๋ ฅ๊ฐ์ ๋ค์ ํธ์งํ ์ ์์ต๋๋ค (์ฌ๋ฑ๋ก ๋ถํ์)
-
-> ๐ก ํ ํตํฉ์ผ๋ก 13๊ฐ์ง ์๋น์ค๋ฅผ ๋ชจ๋ ๋ค๋ฃจ๋ฏ๋ก **์๋น์ค๋ง๋ค ๋ณ๋๋ก ํญ๋ชฉ์ ์ถ๊ฐ**ํ๋ฉด ๋ฉ๋๋ค. ๊ฐ์ ์๋น์ค๋ฅผ ์ฌ๋ฌ ์ง์ญ/๊ณ์ ์ผ๋ก **์ค๋ณต ๋ฑ๋ก**(์: ๋ณธ๊ฐ + ์ฒ๊ฐ ์ฝ๊ตญ ๋ ๋ค)ํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.
-
-> ๐ **์์ ํ** โ API ํค๊ฐ ํ์ํ ์๋น์ค๋, ๋จผ์ [๐ API ํค ๋ฐ๊ธ ๊ฐ์ด๋](#-api-ํค-๋ฐ๊ธ-๊ฐ์ด๋)์์ ํค๋ฅผ ๋ฐ์ ํด๋ฆฝ๋ณด๋์ ๋ณต์ฌํด๋ ๋ค ๋ฑ๋กํ๋ฉด ๊ฐ์ฅ ๋น ๋ฆ
๋๋ค.
-
-### ๐ ์ํ ์ ํธ๋ฆฌํฐ
-
-| ์๋น์ค | ํ์ํ ์ ๋ณด |
+| ํญ๋ชฉ | ๊ฐ |
|---|---|
-| โก **KEPCO** | ํ์ ํํ์ด์ง ์ฌ์ฉ์ ID / ๋น๋ฐ๋ฒํธ |
-| ๐ง **์๋ฆฌ์** | ์์ฉ๊ฐ๋ฒํธ / ๊ณ ๊ฐ๋ช
|
-| ๐ **๊ฐ์ค์ฑ** | ํ ํฐ / ํ์ ID / ์ฌ์ฉ๊ณ์ฝ๋ฒํธ (๋ชจ๋ฐ์ผ ์ฑ์์ ์ถ์ถ) |
-
-### ๐จ ์์ ยท ์ฌ๋
+| ๐ ํฌํธ | [ํ์ ์์ ๋ถ ์์ ๋ฐ์ดํฐํฌํธ (safetydata.go.kr)](https://www.safetydata.go.kr) |
+| ๐ ๋ฐ๋ก ๊ฒ์ | ์ ํฌํธ ์๋จ ๊ฒ์์ฐฝ์ `์ฌ๋๋ฌธ์` ์
๋ ฅ |
+| ๊ฒ์์ด | `์ฌ๋๋ฌธ์` |
+| ์ด์๊ธฐ๊ด | ํ์ ์์ ๋ถ |
+| ์ฝ๋ ํธ์ถ endpoint | `safetydata.go.kr/V2/api/DSSP-IF-00247` |
-| ์๋น์ค | ํ์ํ ์ ๋ณด |
-|---|---|
-| ๐ข **์ฌ๋๋ฌธ์** | `safetydata.go.kr` ์ธ์ฆํค / ๊ด์ญ์๋(ํ์) / ์๊ตฐ๊ตฌ(์ ํ) |
-| ๐จ **์์ ์๋ฆผ** | ๊ด์ญ์๋ + ์๊ตฐ๊ตฌ ๋ค์ค ์ ํ (์์ธ์ ์์น๊ตฌ ๋จ์) |
-| ๐ช๏ธ **๊ธฐ์ํน๋ณด** | `data.go.kr` ์๋น์ค ํค / ๊ด์ญ์๋ ์ฝ๋ ๋ค์ค ์ ํ |
-| ๐ **์ง์ง** | `data.go.kr` ์๋น์ค ํค / ์๋ยท๊ฒฝ๋ / ๋ฐ๊ฒฝ(km, ๊ธฐ๋ณธ 200) / ์ต์ ๊ท๋ชจ(๊ธฐ๋ณธ 3.0) |
+> โ ๏ธ ์์ ๋ฐ์ดํฐํฌํธ์ ๊ณต๊ณต๋ฐ์ดํฐํฌํธ๊ณผ **๋ค๋ฅธ ์ฌ์ดํธ**์
๋๋ค. ์ด๋ฏธ `data.go.kr` ๊ณ์ ์ด ์์ด๋ ๋ณ๋ ๊ฐ์
์ด ํ์ํฉ๋๋ค.
-### โ
ํ๊ฒฝ ยท ๋ ์จ
+---
-| ์๋น์ค | ํ์ํ ์ ๋ณด |
-|---|---|
-| โ
**๊ธฐ์์ฒญ ๋๋ค์๋ณด** | `data.go.kr` ์๋น์ค ํค / ์๋ โ ์๊ตฐ๊ตฌ (์ต์
: ์ธ๊ทผ ์์ด์ฝ๋ฆฌ์ ์ธก์ ์) |
-| ๐ซ๏ธ **์์ด์ฝ๋ฆฌ์** | `data.go.kr` ์๋น์ค ํค / ์๋ โ ์ธก์ ์ ๋ค์ค ์ ํ (์ต์
: ์ํ์ง์ ํค) |
+### ๐ช๏ธ ๊ธฐ์ํน๋ณด + ๐ ์ง์ง + โ
๋๋ค์๋ณด (๊ธฐ์์ฒญ 3์ข
โ ๊ฐ์ ์ธ์ฆํค)
-### ๐ ์ํ ์ ๋ณด
+์ธ ๋ฐ์ดํฐ์
๋ชจ๋ `data.go.kr` ์ด์๊ธฐ๊ด **๊ธฐ์์ฒญ** (`1360000`). ์ธ์ฆํค๋ *๋ด ๊ณ์ ์ ํ๋์ ํค*๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ์ง๋ง, **ํ์ฉ์ ์ฒญ์ ๊ฐ๊ฐ ๋ฐ๋ก** ํด์ผ ํฉ๋๋ค.
-| ์๋น์ค | ํ์ํ ์ ๋ณด |
-|---|---|
-| ๐ **์ฝ๊ตญ** | `data.go.kr` ์๋น์ค ํค / ์๋ โ ์๊ตฐ๊ตฌ |
-| โฝ **์ ๊ฐ** | Opinet API ํค / ์๋ ๋ค์ค + ์ ์ข
๋ค์ค |
-| ๐ซ **ํ๊ต** | NEIS API ํค / ํ๊ต๊ธ โ ํ๊ต ๊ฒ์ โ ํ๋
ยท๋ฐ โ ๊ต์ ์๊ฐ |
-| ๐ **๋์ค๊ตํต** | ์์ธ API ํค + ๊ตญํ ๋ถ ๋ฒ์ค API ํค โ ์งํ์ฒ ์ญ / ์นด์นด์ค๋งต ์ ๋ฅ์ฅ ID ์ถ๊ฐ |
+| ์๋น์ค | ๋ฐ๋ก ๊ฒ์ | ๊ฒ์์ด | endpoint |
+|---|---|---|---|
+| ๐ช๏ธ ๊ธฐ์ํน๋ณด | [๐ ๊ธฐ์ํน๋ณด ๊ฒ์](https://www.data.go.kr/tcs/dss/selectDataSetList.do?searchKeyword=๊ธฐ์ํน๋ณด) | `๊ธฐ์ํน๋ณด` | `1360000/WthrWrnInfoService` |
+| ๐ ์ง์ง์ ๋ณด | [๐ ์ง์ง์ ๋ณด ๊ฒ์](https://www.data.go.kr/tcs/dss/selectDataSetList.do?searchKeyword=์ง์ง์ ๋ณด) | `์ง์ง์ ๋ณด` | `1360000/EqkInfoService` |
+| โ
๋จ๊ธฐ์๋ณด | [๐ ๋จ๊ธฐ์๋ณด ๊ฒ์](https://www.data.go.kr/tcs/dss/selectDataSetList.do?searchKeyword=๋จ๊ธฐ์๋ณด) | `๋จ๊ธฐ์๋ณด` | `1360000/VilageFcstInfoService_2.0` |
---
-## ๐ API ํค ๋ฐ๊ธ ๊ฐ์ด๋
+### ๐ซ๏ธ ์์ด์ฝ๋ฆฌ์ (๋๊ธฐ์ง) โ **2๊ฑด ํ์**
-๋๋ถ๋ถ์ ํ๊ตญ ๊ณต๊ณต ์๋น์ค๋ **๋ฌด๋ฃ** ์ธ์ฆํค๋ง ์์ผ๋ฉด ์ฌ์ฉํ ์ ์์ง๋ง, **ํฌํธ๊ณผ ๋ฐ์ดํฐ์
์ด ์๋น์ค๋ง๋ค ๋ค๋ฅด๊ธฐ ๋๋ฌธ์** ํ ๋ฒ์ ํท๊ฐ๋ฆฌ๊ธฐ ์ฝ์ต๋๋ค. ์๋ ํ โ ์์ธ ์๋ด ์์๋ก ์ ๋ฆฌํ์ต๋๋ค.
+`data.go.kr` ์ด์๊ธฐ๊ด **ํ๊ตญํ๊ฒฝ๊ณต๋จ** (`B552584`) ์ ๋ฐ์ดํฐ์
2๊ฑด์ ๊ฐ๊ฐ ํ์ฉ์ ์ฒญํด์ผ ํฉ๋๋ค.
-### ํ๋์ ๋ณด๊ธฐ โ ์ด๋์ ๋ญ ๋ฐ์์ผ ํ๋๊ฐ?
+| ๋ฐ์ดํฐ์
| ๋ฐ๋ก ๊ฒ์ | ๊ฒ์์ด | endpoint |
+|---|---|---|---|
+| ์ธก์ ์์ ๋ณด | [๐ ์ธก์ ์์ ๋ณด](https://www.data.go.kr/tcs/dss/selectDataSetList.do?searchKeyword=์์ด์ฝ๋ฆฌ์%20์ธก์ ์) | `์์ด์ฝ๋ฆฌ์ ์ธก์ ์` | `B552584/MsrstnInfoInqireSvc` |
+| ๋๊ธฐ์ค์ผ์ ๋ณด | [๐ ๋๊ธฐ์ค์ผ์ ๋ณด](https://www.data.go.kr/tcs/dss/selectDataSetList.do?searchKeyword=์์ด์ฝ๋ฆฌ์%20๋๊ธฐ์ค์ผ) | `์์ด์ฝ๋ฆฌ์ ๋๊ธฐ์ค์ผ` | `B552584/ArpltnInforInqireSvc` |
-> โน๏ธ ํ ์์ ์ ๋ณด๋ ๋ ๊ฐ์ง๋ก ๊ตฌ๋ถ๋ฉ๋๋ค:
-> - **โ
๊ฒ์ฆ๋จ** โ ๋ณธ ์ปดํฌ๋ํธ๊ฐ ํธ์ถํ๋ endpoint URL๊ณผ ์ด์๊ธฐ๊ด ์ฝ๋๋ [์์ค ์ฝ๋](custom_components/kr_component_kit/)์์ ์ง์ ํ์ธํ ์ฌ์ค
-> - **๐ ๊ฒ์ ํค์๋ / ๋ฑ๋ก๋ช
** โ data.go.kr ํฌํธ ์ธก์์ ๋ฐ์ดํฐ์
์ด๋ฆ์ ๊ฐ๋ ๋ฐ๋๋ฏ๋ก, ๋ฑ๋ก๋ช
์ผ์น๊ฐ ์๋ **๊ฒ์ ํค์๋ + ์ด์๊ธฐ๊ด + endpoint URL** 3์ค ๊ธฐ์ค์ผ๋ก ์ฐพ์ผ์ธ์
->
-> ํ์ฉ์ ์ฒญ์ *๋ฐ์ดํฐ์
๋จ์* ๋ก ๋ฐ๋ก ํด์ผ ํฉ๋๋ค. ๊ฐ์ ์ธ์ฆํค๋ผ๋ ์ ์ฒญ ์ ํ ๋ฐ์ดํฐ์
์ ํธ์ถ ์ `403` ์ ๋ฐ์ต๋๋ค.
+> ๐ก ์ธก์ ์์ ๋ณด ๋น ์ง๋ฉด HA ์ค์ ํ๋ฉด์ ์ธก์ ์ dropdown์ด ๋น์ด ๋ณด์
๋๋ค.
-| ์ฌ์ฉํ ์๋น์ค | ๋ฐ๊ธ ํฌํธ | ๊ฒ์ ํค์๋ | ์ด์๊ธฐ๊ด / Endpoint URL (๊ฒ์ฆ๋จ) |
-|---|---|---|---|
-| ๐ **์ฝ๊ตญ** | [๊ณต๊ณต๋ฐ์ดํฐํฌํธ](https://www.data.go.kr) | `์ ๊ตญ ์ฝ๊ตญ` ยท `์ฝ๊ตญ ์ ๋ณด` | ๊ตญ๋ฆฝ์ค์์๋ฃ์ (`B552657`) ยท `B552657/ErmctInsttInfoInqireService` |
-| ๐ข **์ฌ๋๋ฌธ์** | [ํ์ ์์ ๋ถ ์์ ๋ฐ์ดํฐํฌํธ](https://www.safetydata.go.kr) | `์ฌ๋๋ฌธ์` | ํ์ ์์ ๋ถ ยท `safetydata.go.kr/V2/api/DSSP-IF-00247` |
-| ๐ช๏ธ **๊ธฐ์ํน๋ณด** | [๊ณต๊ณต๋ฐ์ดํฐํฌํธ](https://www.data.go.kr) | `๊ธฐ์ํน๋ณด` | ๊ธฐ์์ฒญ (`1360000`) ยท `1360000/WthrWrnInfoService` |
-| ๐ **์ง์ง** | [๊ณต๊ณต๋ฐ์ดํฐํฌํธ](https://www.data.go.kr) | `์ง์ง์ ๋ณด` | ๊ธฐ์์ฒญ (`1360000`) ยท `1360000/EqkInfoService` |
-| โ
**๋๋ค์๋ณด** | [๊ณต๊ณต๋ฐ์ดํฐํฌํธ](https://www.data.go.kr) | `๋จ๊ธฐ์๋ณด` ยท `๋๋ค์๋ณด` | ๊ธฐ์์ฒญ (`1360000`) ยท `1360000/VilageFcstInfoService_2.0` |
-| ๐ซ๏ธ **์์ด์ฝ๋ฆฌ์ (2๊ฑด ํ์)** | [๊ณต๊ณต๋ฐ์ดํฐํฌํธ](https://www.data.go.kr) | `๋๊ธฐ์ค์ผ์ ๋ณด` + `์ธก์ ์์ ๋ณด` | ํ๊ตญํ๊ฒฝ๊ณต๋จ (`B552584`) ยท `B552584/ArpltnInforInqireSvc` + `B552584/MsrstnInfoInqireSvc` *(๋ ๋ฐ์ดํฐ์
๊ฐ๊ฐ ํ์ฉ์ ์ฒญ ํ์)* |
-| ๐ซ๏ธ **์์ด์ฝ๋ฆฌ์ (์ต์
โ UV/๋๊ธฐ์ ์ฒด)** | [๊ณต๊ณต๋ฐ์ดํฐํฌํธ](https://www.data.go.kr) | `์ํ๊ธฐ์์ง์` | ๊ธฐ์์ฒญ (`1360000`) ยท `1360000/LivingWthrIdxServiceV4` โ ๏ธ *(V5๋ก ์
๊ทธ๋ ์ด๋ ์งํ ์ค์ผ ์ ์์ โ [๊ด๋ จ ์ด์](#-์์ด์ฝ๋ฆฌ์-์ํ๊ธฐ์์ง์-v4v5-์ฃผ์) ์ฐธ๊ณ )* |
-| โฝ **์ ๊ฐ** | [Opinet ์คํผ๋ท](https://www.opinet.co.kr/user/api/empApiInfo.do) | ๋ฌด๋ฃ ํ์๊ฐ์
โ API ์ ์ฒญ (๊ณต๊ณต๋ฐ์ดํฐํฌํธ๊ณผ ๋ณ๊ฐ) | Opinet ยท `www.opinet.co.kr/api` |
-| ๐ซ **ํ๊ต** | [NEIS ๊ต์ก์ ๋ณด ๊ฐ๋ฐฉ ํฌํธ](https://open.neis.go.kr) | ํ์๊ฐ์
โ ์ธ์ฆํค ๋ฐ๊ธ (๊ณต๊ณต๋ฐ์ดํฐํฌํธ๊ณผ ๋ณ๊ฐ) | NEIS ยท `open.neis.go.kr/hub` |
-| ๐ **๋์ค๊ตํต(์งํ์ฒ )** | [์์ธ ์ด๋ฆฐ๋ฐ์ดํฐ๊ด์ฅ](https://data.seoul.go.kr) | `์งํ์ฒ ์ค์๊ฐ ๋์ฐฉ์ ๋ณด` | ์์ธํน๋ณ์ ยท `swopenAPI.seoul.go.kr` |
-| ๐ **๋์ค๊ตํต(๋ฒ์ค)** | [๊ณต๊ณต๋ฐ์ดํฐํฌํธ](https://www.data.go.kr) | `๋ฒ์ค๋์ฐฉ์ ๋ณด` ๋๋ `TAGO` | ๊ตญํ ๊ตํต๋ถ ยท `apis.data.go.kr/...๋ฒ์ค๋์ฐฉ์ ๋ณด` ๊ณ์ด |
-
-> โ ๏ธ **๊ฐ์ฅ ์์ฃผ ๋ฐ์ํ๋ ์ค์**
-> - **์ฌ๋๋ฌธ์ ํค โ ์ฝ๊ตญ ํค.** ๋ ํฌํธ(`safetydata.go.kr` vs `data.go.kr`)์ด ๋ค๋ฆ
๋๋ค.
-> - ๊ฐ์ `data.go.kr` ์์์๋ **๋ฐ์ดํฐ์
๋ง๋ค ํ์ฉ์ ์ฒญ์ ๋ฐ๋ก** ํด์ผ ํฉ๋๋ค. ์ฝ๊ตญ ์ ์ฒญํ ํค๋ก ๊ธฐ์ํน๋ณด๊ฐ ์ ๋ฉ๋๋ค.
-> - ์ ์ฒญ ์งํ์๋ ํค๊ฐ ํ์ฑํ๋๊ธฐ๊น์ง **1~2์๊ฐ** ๊ฑธ๋ฆด ์ ์์ต๋๋ค(ํนํ data.go.kr ์ด์๊ธฐ๊ด ํค).
+> โ ๏ธ **์ต์
โ ์ํ๊ธฐ์์ง์ (UVยท๋๊ธฐ์ ์ฒด)**: ์ฌ์ฉํ๋ ค๋ฉด ์ถ๊ฐ๋ก `์ํ๊ธฐ์์ง์` ๊ฒ์ โ ๊ธฐ์์ฒญ ๋ฐ์ดํฐ์
ํ์ฉ์ ์ฒญ. ๋จ ์ฝ๋๋ V4 endpoint ํธ์ถ์ด์ง๋ง ํฌํธ์ V5๋ก ์
๊ทธ๋ ์ด๋๋ ์ํ๋ก ๋ณด์
๋๋ค โ ์ค์ ๋์ ๋ฏธ๊ฒ์ฆ. ๋ฑ๋ก ํ HA ๋ก๊ทธ(`LivingWthrIdx` ๊ฒ์)๋ก ํ์ธํ์ธ์. ๋ฏธ์๋ ์ issue ๋ถํ๋๋ฆฝ๋๋ค.
---
-### ๐ ์ฝ๊ตญ โ ๊ฐ์ฅ ์์ฃผ ๋ฌป๋ ํญ๋ชฉ
-
-์ฝ๊ตญ ๋ฐ์ดํฐ๋ **๊ตญ๋ฆฝ์ค์์๋ฃ์(NMC)** ์ด ์ ๊ณตํ๋ฉฐ **๊ณต๊ณต๋ฐ์ดํฐํฌํธ(data.go.kr)** ์์ ๋ฐ์ต๋๋ค.
+### โฝ ์ ๊ฐ (Opinet)
-**๋จ๊ณ๋ณ ์๋ด:**
+| ํญ๋ชฉ | ๊ฐ |
+|---|---|
+| ๐ ํฌํธ | [๐ Opinet ์คํผ๋ท API ์ ์ฒญ ํ์ด์ง](https://www.opinet.co.kr/user/api/empApiInfo.do) |
+| ๋ฐ๊ธ ์ ์ฐจ | ๋ฌด๋ฃ ํ์๊ฐ์
โ API ์ ์ฒญ โ ์ฆ์ ๋ฐ๊ธ |
+| ์ฝ๋ ํธ์ถ endpoint | `opinet.co.kr/api/avgAllPrice.do`, `lowTop10.do` |
-1. **๊ณต๊ณต๋ฐ์ดํฐํฌํธ ๊ฐ์
** โ โ ์ฐ์ธก ์๋จ ํ์๊ฐ์
(์ด๋ฉ์ผ/์นด์นด์ค/๋ค์ด๋ฒ OAuth ๊ฐ๋ฅ)
-2. **๋ฐ์ดํฐ์
๊ฒ์** โ ์๋จ ๊ฒ์์ฐฝ์ `์ ๊ตญ ์ฝ๊ตญ` ๋๋ `์ฝ๊ตญ ์ ๋ณด` ์
๋ ฅ
-3. **๊ฒฐ๊ณผ ์ค ์ ํ** โ ์ด์๊ธฐ๊ด **๊ตญ๋ฆฝ์ค์์๋ฃ์**, ๋ฑ๋ก๋ช
**"๊ตญ๋ฆฝ์ค์์๋ฃ์_์ ๊ตญ ์ฝ๊ตญ ์ ๋ณด ์กฐํ ์๋น์ค"** ํญ๋ชฉ ์ ํ *(์ด์๊ธฐ๊ด ์ฝ๋ `B552657`)*
-4. **ํ์ฉ ์ ์ฒญ** ๋ฒํผ ํด๋ฆญ โ ํ์ฉ ๋ชฉ์ ๋์ ์งง๊ฒ ์
๋ ฅ (์: "Home Assistant ๊ฐ์ ์ฉ ๋ชจ๋ํฐ๋ง")
-5. **๋ง์ดํ์ด์ง โ ์คํAPI โ ์ธ์ฆํค ๋ฐ๊ธํํฉ** ์์ **์ผ๋ฐ ์ธ์ฆํค(Decoding)** ๋ณต์ฌ
-6. Home Assistant ์ค์ ํ๋ฉด์ ์ฝ๊ตญ ํญ๋ชฉ์ ๊ทธ๋๋ก ๋ถ์ฌ๋ฃ๊ธฐ
+> ๐ก Opinet์ ๊ณต๊ณต๋ฐ์ดํฐํฌํธ๊ณผ **๋ณ๊ฐ ํฌํธ**์
๋๋ค.
-> ๐ก **์ฝ๋ ํธ์ถ endpoint** *(์ฐธ๊ณ ์ฉ)*: `apis.data.go.kr/B552657/ErmctInsttInfoInqireService/getParmacyListInfoInqire`. ๋ฐ์ดํฐ์
๋ฑ๋ก๋ช
์ ํฌํธ ์ ์ฑ
์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋ ์ ์์ผ๋, ์ผ์นํ์ง ์์ผ๋ฉด **์ด์๊ธฐ๊ด ์ฝ๋ `B552657`** ๋ก๋ ๊ฒ์ ๊ฐ๋ฅํฉ๋๋ค.
+---
-**์ฝ๊ตญ API ๊ด๋ จ ์ฃผ์์ฌํญ:**
+### ๐ซ ํ๊ต (NEIS)
-| ์ฆ์ | ์์ธ / ํด๊ฒฐ |
+| ํญ๋ชฉ | ๊ฐ |
|---|---|
-| `401 Unauthorized` | ์๋น์คํค ์์ฒด๊ฐ ์๋ชป๋จ (์คํยท๊ณต๋ฐฑ). ๋ง์ดํ์ด์ง์์ ๋ค์ ๋ณต์ฌ |
-| `403 Forbidden` ๋๋ `SERVICE_KEY_IS_NOT_REGISTERED_ERROR` | ํค๋ ๋ง์ง๋ง **ํด๋น ๋ฐ์ดํฐ์
์ ํ์ฉ ์ ์ฒญ์ ์ ํ์.** "๋ง์ดํ์ด์ง โ ํ์ฉ์ ์ฒญ ํํฉ"์์ *์น์ธ* ์ํ์ธ์ง ํ์ธ |
-| ์ ์ฒญ ์งํ ์ ๋จ | ๋ฐ์ดํฐ์
์ด ์ด์๊ธฐ๊ด ํค๋ผ **ํ์ฑํ์ 1~2์๊ฐ** ๊ฑธ๋ฆด ์ ์์ |
-| Encoding/Decoding ํค ๋ ๋ค ์ค์ ํท๊ฐ๋ฆผ | ๋ณธ ํตํฉ์ **๋ ๋ค ํธํ** โ ์๋ฌด๊ฑฐ๋ ๋ถ์ฌ๋ฃ์ผ๋ฉด ๋ฉ๋๋ค (URL ์ธ์ฝ๋ฉ์ ์๋ ์ฒ๋ฆฌ) |
+| ๐ ํฌํธ | [๐ NEIS ๊ต์ก์ ๋ณด ๊ฐ๋ฐฉ ํฌํธ](https://open.neis.go.kr) |
+| ๋ฐ๊ธ ์ ์ฐจ | ํ์๊ฐ์
โ ์ธ์ฆํค ์ ์ฒญ โ ๋ง์ดํ์ด์ง "์ ์ฒญํํฉ" ์์ ํ์ธ |
+| ์ฝ๋ ํธ์ถ endpoint | `open.neis.go.kr/hub/...` |
+
+> ๐ก NEIS๋ ๊ณต๊ณต๋ฐ์ดํฐํฌํธ๊ณผ **๋ณ๊ฐ ํฌํธ**์
๋๋ค. ํ๊ต๋ช
์ HA ์ค์ ์์ ์๋ ๊ฒ์๋ฉ๋๋ค (ํ๊ต๋ช
๋ง ์
๋ ฅํ๋ฉด dropdown ํ์).
---
-### ๐ข ์ฌ๋๋ฌธ์ โ ๋ณ๋ ํฌํธ (๊ฐ์ฅ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ)
+### ๐ ๋์ค๊ตํต โ ์๋๋ฆฌ์ค๋ณ ํค
-์ฌ๋๋ฌธ์๋ง์ ์ผ๋ฐ ๊ณต๊ณต๋ฐ์ดํฐํฌํธ์ด ์๋ **ํ์ ์์ ๋ถ ์์ ๋ฐ์ดํฐํฌํธ**์์ ๋ฐ์ต๋๋ค.
+๋ณธ์ธ์ด ์ธ ๊ธฐ๋ฅ์ ๋ฐ๋ผ ํ์ํ ํค๊ฐ ๋ค๋ฆ
๋๋ค.
-1. ์ ์ โ ํ์๊ฐ์
-2. ์๋จ ๊ฒ์์์ `์ฌ๋๋ฌธ์` ๊ฒ์ โ ๋ณธ ์ปดํฌ๋ํธ๊ฐ ํธ์ถํ๋ endpoint๋ **`safetydata.go.kr/V2/api/DSSP-IF-00247`** ์
๋๋ค. ๊ฒฐ๊ณผ ํญ๋ชฉ ์ค ์๋ณ๋ฒํธ `DSSP-IF-00247` ๋๋ ๋์ผ URL์ด ๋ช
์๋ ๋ฐ์ดํฐ์
์ ์ ํํ์ธ์.
-3. **ํ์ฉ์ ์ฒญ โ ์ธ์ฆํค ๋ฐ๊ธ**
-4. ๋ฐ๊ธ๋ ํค๋ฅผ Home Assistant ์ฌ๋๋ฌธ์ ํญ๋ชฉ์ ์
๋ ฅ
+| ์๋๋ฆฌ์ค | ํ์ํ ํค | ๋ฐ๊ธ์ฒ |
+|---|---|---|
+| ์งํ์ฒ ๋์ฐฉ์ ๋ณด | ์์ธ ์ด๋ฆฐ๋ฐ์ดํฐ๊ด์ฅ ํค | [๐ data.seoul.go.kr](https://data.seoul.go.kr) โ `์งํ์ฒ ์ค์๊ฐ ๋์ฐฉ์ ๋ณด` ์ ์ฒญ |
+| ๋ฒ์ค ๋์ฐฉ์ ๋ณด | **โ ๋ถํ์** | ์นด์นด์ค๋งต ๋น๊ณต์ endpoint ์ฌ์ฉ. ์ ๋ฅ์ฅ ID๋ง ์
๋ ฅ |
+| ํ์น๊ฒฝ๋ก ๊ฒ์ (์ต์
) | ์์ธ์ ํ์น๊ฒฝ๋ก API ํค | [๐ data.go.kr](https://www.data.go.kr/tcs/dss/selectDataSetList.do?searchKeyword=๋์ค๊ตํตํ์น๊ฒฝ๋ก) โ `๋์ค๊ตํตํ์น๊ฒฝ๋ก` |
-> ๐ก ์์ ๋ฐ์ดํฐํฌํธ์ ๊ฐ์ ์ ๋ถ ์์คํ
์ด์ง๋ง **๊ณต๊ณต๋ฐ์ดํฐํฌํธ๊ณผ ๊ณ์ ยทํค๊ฐ ๋ถ๋ฆฌ**๋์ด ์์ต๋๋ค. ์ด๋ฏธ `data.go.kr` ๊ณ์ ์ด ์์ด๋ ๋ณ๋ ๊ฐ์
์ด ํ์ํฉ๋๋ค.
+**์นด์นด์ค๋งต ์ ๋ฅ์ฅ ID ์ฐพ๋ ๋ฒ** *(๋ฒ์ค ๋ฑ๋ก ์)*:
+[์นด์นด์ค๋งต](https://map.kakao.com) โ ์ ๋ฅ์ฅ ๊ฒ์ โ ์ ๋ฅ์ฅ ํด๋ฆญ โ URL `?busstopid=03171&...` โ **`busstopid=` ๋ค์ ๊ฐ** ๋ณต์ฌ (์: `03171`, `BS09013700`).
---
-### ๐ช๏ธ๐โ
๊ธฐ์์ฒญ (ํน๋ณด/์ง์ง/๋จ๊ธฐ์๋ณด) โ ํ ํค๋ก OK
-
-๊ธฐ์์ฒญ API 3์ข
์ **๋ชจ๋ ๊ณต๊ณต๋ฐ์ดํฐํฌํธ์์ ๋ฐ์ง๋ง ๋ฐ์ดํฐ์
์ด ๊ฐ๊ฐ ๋ค๋ฅด๋ฏ๋ก ํ์ฉ์ ์ฒญ์ 3๋ฒ ํด์ผ ํฉ๋๋ค.** ์ธ์ฆํค ์์ฒด๋ *๋ด ๊ณ์ ํ๋์ ๋ฐ๊ธ๋ ๊ฐ์ ํค*๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํฉ๋๋ค.
-
-| ์ฝ๋ ํธ์ถ endpoint (๊ฒ์ฆ๋จ) | ๊ถ์ฅ ๊ฒ์ ํค์๋ |
-|---|---|
-| `1360000/WthrWrnInfoService` (๊ธฐ์ํน๋ณด) | `๊ธฐ์ํน๋ณด` |
-| `1360000/EqkInfoService` (์ง์ง์ ๋ณด) | `์ง์ง์ ๋ณด` |
-| `1360000/VilageFcstInfoService_2.0` (๋จ๊ธฐ์๋ณด) | `๋จ๊ธฐ์๋ณด` |
+## โ๏ธ ๋ฑ๋กยท์ฌ์ค์ ํ๋ฆ
-- ๊ฐ๊ฐ์ ๋ฐ์ดํฐ์
ํ์ด์ง์์ **ํ์ฉ์ ์ฒญ** โ ๋ง์ดํ์ด์ง์์ *์น์ธ* ํ์ธ
-- Home Assistant ๊ฐ ํญ๋ชฉ์ ๊ฐ์ ์ธ์ฆํค๋ฅผ ์
๋ ฅ
-- ์ด์๊ธฐ๊ด ์ฝ๋ `1360000` (๊ธฐ์์ฒญ) ์ผ๋ก๋ ์ด์๊ธฐ๊ด ๊ฒ์์ด ๊ฐ๋ฅํฉ๋๋ค.
+### ์ ํญ๋ชฉ ๋ฑ๋ก
+์ค์ โ ๊ธฐ๊ธฐ ๋ฐ ์๋น์ค โ **+ ํตํฉ ๊ตฌ์ฑ์์ ์ถ๊ฐ** โ `ํ๊ตญ ์ปดํฌ๋ํธ ํคํธ` ๊ฒ์ โ ์ํ๋ ์๋น์ค ์ ํ.
----
+> ํ ํตํฉ์ 13๊ฐ ์๋น์ค๊ฐ ๋ฉ๋ด๋ก ๋ค์ด์์ด, ์ถ๊ฐํ๋ ค๋ ์๋น์ค๋ง๋ค ํ ๋ฒ์ฉ ๋ฑ๋กํฉ๋๋ค. **๊ฐ์ ์๋น์ค๋ฅผ ์ฌ๋ฌ ์ง์ญ์ผ๋ก ์ค๋ณต ๋ฑ๋ก**๋ ๊ฐ๋ฅ (์: ์ฝ๊ตญ์ ์ํฅ์ยท์์์ยท๋ถ๋ชจ๋ ๋ ์๊ตฐ๊ตฌ 3๋ฒ ๋ฑ๋ก).
-### ๐ซ๏ธ ์์ด์ฝ๋ฆฌ์ โ ํ์ 2๊ฑด + ์ต์
1๊ฑด
+### ๋ฑ๋ก ํ ๋ณ๊ฒฝ (API ํค ๊ฐฑ์ / ์ง์ญ ์ถ๊ฐ ๋ฑ)
+ํด๋น ํญ๋ชฉ ์ **"๊ตฌ์ฑ"** ๋ฒํผ โ ์
๋ ฅ๊ฐ ํธ์ง. *(์ญ์ ยท์ฌ๋ฑ๋ก ์์ด ๊ฐ๋ฅ. entity์ ์๋ํ ์ฐ๊ฒฐ ์ ์ง๋จ.)*
-**ํ์ (๋ ๋ค ํ์ฉ์ ์ฒญํด์ผ ๋์):**
-- ๊ฒ์ `๋๊ธฐ์ค์ผ์ ๋ณด` โ **ํ๊ตญํ๊ฒฝ๊ณต๋จ_์์ด์ฝ๋ฆฌ์_๋๊ธฐ์ค์ผ์ ๋ณด** *(๋ฏธ์ธ๋จผ์งยทOโยทNOโ ๋ฑ ์ค์๊ฐ ์์น + ์๋ณด)*
-- ๊ฒ์ `์ธก์ ์์ ๋ณด` โ **ํ๊ตญํ๊ฒฝ๊ณต๋จ_์์ด์ฝ๋ฆฌ์_์ธก์ ์์ ๋ณด** *(์๋๋ณ ์ธก์ ์ ๋ชฉ๋ก)*
-- ๋ ๋ฐ์ดํฐ์
์ ์ด์๊ธฐ๊ด(B552584)์ด ๊ฐ์ง๋ง ํ์ฉ์ ์ฒญ์ **๊ฐ๊ฐ** ํด์ผ ํฉ๋๋ค. ์ธก์ ์์ ๋ณด ์ ์ฒญ์ด ๋น ์ง๋ฉด config flow์์ ์ธก์ ์ ์ ํ dropdown์ด ๋น์ด ๋ณด์ผ ์ ์์ต๋๋ค.
+### ์
๋ ฅ๊ฐ ์ด๋์ ๋ฐ๋๊ฐ?
-**์ต์
(์์ธ์ ์ง์ยท๋๊ธฐ์ ์ฒด์ง์ sensor๋ฅผ ์ฐ๊ณ ์ถ์ ๋๋ง):**
-- ๊ฒ์ `์ํ๊ธฐ์์ง์` โ ์ด์๊ธฐ๊ด **๊ธฐ์์ฒญ** ๋ฐ์ดํฐ์
ํ์ฉ์ ์ฒญ
-- โ ๏ธ **V4/V5 ์ฃผ์** โ ๋ณธ ์ปดํฌ๋ํธ ์ฝ๋๋ endpoint `LivingWthrIdxServiceV4` ๋ฅผ ํธ์ถํ์ง๋ง, 2026๋
5์ ๊ธฐ์ค ํฌํธ์ ๋ณด์ด๋ ๋ฐ์ดํฐ์
์ ํ์๋ช
"(3.0)" ์ธ๋ฐ ์ค์ endpoint๋ V5 (`LivingWthrIdxServiceV5/getUVIdxV5`)๋ก ์
๊ทธ๋ ์ด๋๋ ์ํ๋ก ํ์ธ๋ฉ๋๋ค. ์ฆ ์ฝ๋๊ฐ V4๋ฅผ ๋ถ๋ฅด๋ฉด ์ ์ ์๋ต์ ๋ฐ์ง ๋ชปํ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋, ์ค์ ์๋ ์ฌ๋ถ๋ HA ๋ก๊ทธ(`์ค์ โ ์์คํ
โ ๋ก๊ทธ` ์์ `LivingWthrIdx` ๊ฒ์)๋ก ํ์ธํ์ธ์. ์ด ๊ธฐ๋ฅ์ ์ ์ฐ๋ฉด ์ ์ฒญ ์์ฒด๊ฐ ๋ถํ์ํฉ๋๋ค.
+| ์๋น์ค | ์ด๋์ ๋ฐ๋๊ฐ |
+|---|---|
+| โก **KEPCO** | ํ์ ํํ์ด์ง ID/๋น๋ฐ๋ฒํธ (๋ณธ์ธ ๊ณ์ , 2์ฐจ ์ธ์ฆ ๋ฏธ์ง์) |
+| ๐ง **์๋ฆฌ์** | ์ข
์ด ๊ณ ์ง์ ๋๋ [์๋ฆฌ์ ์ฌ์ด๋ฒ ๊ณ ๊ฐ์ผํฐ](https://i-arisu.seoul.go.kr) โ ์๊ธ์กฐํ ์ข์ธก ์์ฉ๊ฐ๋ฒํธ + ๊ณ ๊ฐ๋ช
|
+| ๐ **๊ฐ์ค์ฑ** | ์ฌ์ฉ๊ณ์ฝ๋ฒํธ๋ ๊ฐ์ค์ฑ ๋ชจ๋ฐ์ผ ์ฑ โ ๋ด ์ ๋ณด. ํ ํฐยทํ์ID๋ mitmproxy ๋ฑ์ผ๋ก ๋ชจ๋ฐ์ผ ์ฑ HTTPS ์์ฒญ์ `X-Token`/`X-Member` ํค๋ ์ถ์ถ (โ ๏ธ ๊ณ ๊ธ ์ฌ์ฉ์์ฉ) |
+| ๐ **์ง์ง ์ขํ** | ๊ธฐ๋ณธ๊ฐ์ ์์ธ์์ฒญ (`37.5665, 126.978`). **๋ณธ์ธ ์ง ์ขํ๋ก ๊ผญ ๋ณ๊ฒฝ.** ๊ธฐ๋ณธ ๋ฐ๊ฒฝ 200km / ์ต์ ๊ท๋ชจ 3.0 |
---
-### โฝ ์ ๊ฐ (Opinet) ยท ๐ซ ํ๊ต (NEIS) ยท ๐ ๋์ค๊ตํต
+## ๐ ๋ฑ๋กํ๋ฉด ๋ง๋ค์ด์ง๋ entity
-์ด ์
์ ๊ณต๊ณต๋ฐ์ดํฐํฌํธ์ด ์๋ **๊ฐ ์ด์๊ธฐ๊ด ์์ฒด ํฌํธ**์์ ๋ฐ๊ธํฉ๋๋ค. ๊ฐ์
โ ์ ์ฒญ โ ์ฆ์ ๋ฐ๊ธ(๋ณดํต) ํ๋ฆ์ด๋ฉฐ, ๊ฐ์
์ธ ๋ณ๋ค๋ฅธ ์ ์ฐจ ์์ด ๋ฌด๋ฃ๋ก ๋ฐ์ ์ ์์ต๋๋ค.
+> entity_id๋ ํ๊ตญ์ด โ ๋ก๋ง์ ์ฌ๋ฌ๊ทธ ์๋ ๋ณํ (์: `์ฝ๊ตญ - ์ํฅ์` + `์ด์ ์ฝ๊ตญ ์` โ `sensor.yaggug_siheungsi_unyeong_yaggug_su`). ์ ํํ ID๋ **๊ฐ๋ฐ์ ๋๊ตฌ โ ์ํ** ์์ ์นํ ์ด๋ฆ์ผ๋ก ๊ฒ์ํด ํ์ธ.
-- **Opinet** โ
-- **NEIS** โ (ํ์๊ฐ์
ํ "์ ์ฒญํํฉ โ ์ธ์ฆํค ๋ฐ๊ธ")
-- **์์ธ ์งํ์ฒ ** โ ("์ค์๊ฐ ์งํ์ฒ ๋์ฐฉ์ ๋ณด" ์ ์ฒญ)
-- **๊ตญํ ๋ถ ๋ฒ์ค** โ ๊ณต๊ณต๋ฐ์ดํฐํฌํธ์์ `TAGO ๋ฒ์ค๋์ฐฉ์ ๋ณด` ํ์ฉ์ ์ฒญ
-- **์นด์นด์ค๋งต ์ ๋ฅ์ฅ ID** *(๋ฒ์ค ๋ฑ๋ก ์)* โ [์นด์นด์ค๋งต](https://map.kakao.com) ์์ ์ ๋ฅ์ฅ์ ๊ฒ์ยทํด๋ฆญํ๋ฉด URL์ด `https://map.kakao.com/?busstopid=03171&...` ํํ๋ก ๋ฐ๋๋๋ค. **`busstopid=` ๋ค์ ๊ฐ** ์ ๊ทธ๋๋ก ๋ณต์ฌํด ์
๋ ฅํ์ธ์ (์: `03171`, `BS09013700`, `223000122`).
+| ์๋น์ค | ์นํ ์ด๋ฆ (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๊ฐ ๋
ธ์ถํ๋ attribute๋ฅผ ํ์ฉํ๋ฉด ๊น๋ํ ์นด๋๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์๋ ์์ ๋ ๋ชจ๋ **์ถ๊ฐ HACS ์นด๋ ์์ด** Home Assistant ๊ธฐ๋ณธ ์นด๋(`tile`, `markdown`, `entities`)๋ง์ผ๋ก ๋์ํฉ๋๋ค.
+## ๐จ ๋์๋ณด๋ ์์ โ ์ฝ๊ตญ ๊ฐ๊น์ด ์ + ์์
์ค ํํฐ + ์นด์นด์ค๋งต ๊ธธ์ฐพ๊ธฐ
-### ๐ ์ฝ๊ตญ โ ๊ฐ๊น์ด ์ + ์์
์ค ํํฐ + ์นด์นด์ค๋งต ๊ธธ์ฐพ๊ธฐ
+๊ฒ์ยทํํฐ ํฌํผ ๋ ๊ฐ ๋จผ์ :
+- **์ค์ โ ํฌํผ โ ํ
์คํธ**: `input_text.yaggug_geomsaeg` ("์ฝ๊ตญ ๊ฒ์")
+- **์ค์ โ ํฌํผ โ ํ ๊ธ**: `input_boolean.yaggug_yeongeobjungman` ("์ฝ๊ตญ ์์
์ค๋ง")
-์ฝ๊ตญ ์นํ ์ด๋ฆ **"์ด์ ์ฝ๊ตญ ์"** sensor์ `pharmacies` attribute๋ฅผ ํ์ฉํ ์นด๋์
๋๋ค. (`entity_id`๋ HA๊ฐ ์๋ ์์ฑํ ์ฌ๋ฌ๊ทธ โ ์: ์ํฅ์๋ฉด `sensor.yaggug_siheungsi_unyeong_yaggug_su`. ๋ณธ์ธ ์ง์ญ entity_id๋ **๊ฐ๋ฐ์ ๋๊ตฌ โ ์ํ** ์์ `์ด์ ์ฝ๊ตญ ์` ๊ฒ์ ํ ํ์ธํ์ธ์.) ๊ฒ์ยทํํฐ๋ฅผ ์ํด ํฌํผ ๋ ๊ฐ๋ฅผ ๋จผ์ ๋ง๋ค์ด์ฃผ์ธ์:
-
-- **์ค์ โ ํฌํผ โ ํ
์คํธ** : `input_text.yaggug_geomsaeg` (์ด๋ฆ: "์ฝ๊ตญ ๊ฒ์")
-- **์ค์ โ ํฌํผ โ ํ ๊ธ** : `input_boolean.yaggug_yeongeobjungman` (์ด๋ฆ: "์ฝ๊ตญ ์์
์ค๋ง")
-
-๋์๋ณด๋ YAML(์น์
๋๋ vertical-stack์ ํต์งธ๋ก ๋ถ์ฌ๋ฃ๊ธฐ):
+๋์๋ณด๋ YAML *(์น์
/vertical-stack์ ํต์งธ๋ก ๋ถ์ฌ๋ฃ๊ธฐ. ๋ณธ์ธ ์ฝ๊ตญ entity_id๋ก ๋ณ๊ฒฝ)*:
```yaml
type: vertical-stack
@@ -509,7 +234,7 @@ cards:
- type: horizontal-stack
cards:
- type: tile
- entity: sensor.yaggug_siheungsi_unyeong_yaggug_su # ๋ณธ์ธ entity_id ๋ก ๋ณ๊ฒฝ
+ entity: sensor.yaggug_siheungsi_unyeong_yaggug_su # ๋ณธ์ธ entity_id
name: ์ ์ฒด ์ฝ๊ตญ
icon: mdi:pharmacy-marker
color: green
@@ -532,13 +257,11 @@ cards:
- type: markdown
title: ์ฝ๊ตญ ๋ชฉ๋ก (๊ฐ๊น์ด ์)
content: |
- {# ์์น ๊ธฐ์ค entity โ zone.home / person.xxx / device_tracker.xxx ๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅ #}
{% 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 [] %}
- {# input_text ์ ๋น ์ํ๊ฐ 'unknown' ์ผ๋ก ๋ค์ด์ค๋ ๊ฒฝ์ฐ๊ฐ ์์ด ์ ๊ทํ #}
{% 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') %}
@@ -565,136 +288,78 @@ cards:
{% endfor %}
```
-**ํ:**
-- ์์น ๊ธฐ์ค์ ํฐ ๋ฐ๋ผ๊ฐ๊ฒ ํ๋ ค๋ฉด `tracker = 'zone.home'`์ `tracker = 'person.<๋ณธ์ธ>'` ๋๋ `tracker = 'device_tracker.<ํฐ>'`๋ก ๋ณ๊ฒฝ.
-- ์นด์นด์ค๋งต ๋ฅ๋งํฌ๋ PC/๋ชจ๋ฐ์ผ ๋ชจ๋ ์๋, API ํค ๋ถํ์.
-- `open_now`๋ sensor ๊ฐฑ์ ๊ณผ ๋ณ๊ฐ๋ก markdown์ด ๋ ๋๋ ๋๋ง๋ค ์ฌ๊ณ์ฐ๋ฉ๋๋ค (๋ถ ๋จ์๋ ์๋์ง๋ง ์๊ฐ ๋จ์๋ก๋ ์ถฉ๋ถ).
-
-### ์ฌ์ฉ ๊ฐ๋ฅํ sensor attribute ์์ฝ
-
-๊ฐ sensor์ **friendly name** ๊ธฐ์ค์ผ๋ก ์ ๋ฆฌํ ํ์
๋๋ค. ์ค์ `entity_id`๋ ํ๊ธ์ด ๋ก๋ง์๋ก ์ฌ๋ฌ๊ทธํ๋ ํํ์ด๋ฏ๋ก **๊ฐ๋ฐ์ ๋๊ตฌ โ ์ํ** ์์ ์นํ ์ด๋ฆ์ผ๋ก ๊ฒ์ํ๋ฉด ํ์ธํ ์ ์์ต๋๋ค.
-
-| ํตํฉ | ์นํ ์ด๋ฆ | ์ฃผ์ attribute |
-|---|---|---|
-| ์ฝ๊ตญ | `์ด์ ์ฝ๊ตญ ์` | `pharmacies[]` (`name`/`address`/`phone`/`lat`/`lon`/`duty_time`/`today_hours`/`open_now`), `total`, `shown`, `open_now_count` |
-| ๊ธฐ์ํน๋ณด | `<ํธ์ฐ/๊ฐํ/ํํ/ํญ์ผ/...> ํน๋ณด` (event) | `warning_type`, `area`, `start_time`, `end_time` (state = `advisory`/`warning`/`pre_*`/`cancelled`/`none`) |
-| ์์ด์ฝ๋ฆฌ์ | `PM10 ๋ฏธ์ธ๋จผ์ง`, `PM2.5 ์ด๋ฏธ์ธ๋จผ์ง`, `Oโ ์ค์กด`, `NOโ ์ด์ฐํ์ง์`, `SOโ ์ํฉ์ฐ๊ฐ์ค`, `CO ์ผ์ฐํํ์`, `ํตํฉ๋๊ธฐ์ง์ง์` | ๋ฑ๊ธ(`Grade`) attribute ๋๋ฐ. ์ต์
ํค ์
๋ ฅ ์ `์์ธ์ ์ง์`, `๋๊ธฐ์ ์ฒด์ง์` ์ถ๊ฐ |
-| ๊ธฐ์์ฒญ | (weather ์ํฐํฐ) | hourly/daily forecast ์๋น์ค, ์ฒด๊ฐ์จ๋ยท์ด์ฌ์ ยท์ต๋ |
-| ์ ๊ฐ | `์ ๊ตญ ํ๊ท ๊ฐ`, `์ต์ ๊ฐ` | ์ต์ ๊ฐ: `station_name`, `address`, `ranking[]` (Top 5) |
-| ํ๊ต | `๊ธ์`, `ํ๊ต ์ ๋ณด` + `calendar.*` | ๊ธ์: `menu`, `calorie`, `allergy_codes`. ํ๊ต ์ ๋ณด: ํ๋
ยท๋ฐยท์ฃผ์ยท์ ํ |
-| ์ฌ๋๋ฌธ์ | `์ต์ ์ฌ๋๋ฌธ์`, `์ฌ๋๋ฌธ์ ์`, event `์ฌ๋๋ฌธ์ ์ด๋ฒคํธ` | `level`, `area`, `disaster_type` |
-| ์์ ์๋ฆผ | `์ต์ ์์ ์๋ฆผ`, `์์ ์๋ฆผ ์` + binary + event | `latest`, `alerts[]`, `count` |
-| ์ง์ง | event `์ง์ง ๊ฒฝ๋ณด` | event ๋ฐ์ ์ `magnitude`, `location`, `distance_km`, `datetime` |
-| ๋์ค๊ตํต | `<์ญ/์ ๋ฅ์ฅ> <ํธ์ /๋
ธ์ > ... ๋์ฐฉ` | TIMESTAMP โ HA๊ฐ ์๋์ผ๋ก "N๋ถ ํ"๋ก ํ์ |
-| KEPCO | `ํ์ฌ ์ฌ์ฉ๋`, `์ง๋๋ฌ ์๊ธ`, `์์ ์๊ธ`, `๊ณ ๊ฐ๋ฒํธ`, `์ ๋ ฅ๊ตฌ๋ถ` | โ |
-| ์๋ฆฌ์ | `์๋ ์๊ธ`, `์ฌ์ฉ๋`, `์ฒญ๊ตฌ์` | ์๋ ์๊ธ: `billing_month`, `customer_info`, `arrears_info` |
-| ๊ฐ์ค์ฑ | `์ฒญ๊ตฌ ์ ๋ชฉ`, `์ด ์๊ธ` | โ |
+> ๐ก ์์น ๊ธฐ์ค์ ํฐ ๋ฐ๋ผ๊ฐ๊ฒ ํ๋ ค๋ฉด `tracker = 'zone.home'`์ `person.<๋ณธ์ธ>` ๋๋ `device_tracker.<ํฐ>` ์ผ๋ก ๋ณ๊ฒฝ.
---
-## ๐ ์
๋ฐ์ดํธ ์ฃผ๊ธฐ
+## ๐ค ์์ฐ์ด๋ก ๋ฌป๊ธฐ (LLM ์ต์
)
-| ์นดํ
๊ณ ๋ฆฌ | ์๋น์ค | ์ฃผ๊ธฐ | ๋น๊ณ |
-|---|---|---|---|
-| ์ ํธ๋ฆฌํฐ | ํ์ (KEPCO) | 5๋ถ | ๋ก๊ทธ์ธ ์ธ์
๊ด๋ฆฌ |
-| ์ ํธ๋ฆฌํฐ | ์๋ฆฌ์ | 1์๊ฐ | ์๊ธยท์ฌ์ฉ๋ |
-| ์ ํธ๋ฆฌํฐ | ๊ฐ์ค์ฑ | 20๋ถ | ํ ํฐ ๊ฐฑ์ |
-| ์์ ยท์ฌ๋ | ์ฌ๋๋ฌธ์ | 5๋ถ | ์ค์๊ฐ ์๋ฆผ |
-| ์์ ยท์ฌ๋ | ์์ ์๋ฆผ | 5๋ถ | ์ค์๊ฐ ์๋ฆผ |
-| ์์ ยท์ฌ๋ | ๊ธฐ์ํน๋ณด | 15๋ถ | event ์ํฐํฐ |
-| ์์ ยท์ฌ๋ | ์ง์ง | 10๋ถ | event ์ํฐํฐ |
-| ํ๊ฒฝยท๋ ์จ | ๊ธฐ์์ฒญ ๋๋ค์๋ณด | 30๋ถ | weather ์ํฐํฐ |
-| ํ๊ฒฝยท๋ ์จ | ์์ด์ฝ๋ฆฌ์ | 30๋ถ | ์๊ณ์ด |
-| ์ํ | ์ฝ๊ตญ | 1์๊ฐ | open_now๋ ๋งค ๋ ๋ ์ ์ฌ๊ณ์ฐ |
-| ์ํ | ์ ๊ฐ | 1์๊ฐ | Opinet |
-| ์ํ | ํ๊ต | 6์๊ฐ | ์ผ์๋ณ ๋ณํ ๊ฑฐ์ ์์ |
-| ์ํ | ๋์ค๊ตํต โ ์งํ์ฒ | 2๋ถ | ์ค์๊ฐ ๋์ฐฉ |
-| ์ํ | ๋์ค๊ตํต โ ๋ฒ์ค | 1๋ถ | ์ค์๊ฐ ๋์ฐฉ |
+HA์ **Assist + LLM ํตํฉ** (OpenAI / Google / Ollama ๋ฑ)์ ๋ณธ ์ปดํฌ๋ํธ๋ฅผ ๋
ธ์ถํ๋ฉด ํ๊ตญ์ด๋ก ์ง์ ๋ฌผ์ ์ ์์ต๋๋ค.
----
-
-## ๐ ์๊ตฌ์ฌํญ
+| ์ง๋ฌธ | ๋งค์นญ ์๋น์ค |
+|---|---|
+| "์ง๊ธ ์์
์ค์ธ ๊ฐ๊น์ด ์ฝ๊ตญ ์๋ ค์ค" | ๐ ์ฝ๊ตญ |
+| "์ค๋ ๋ฏธ์ธ๋จผ์ง ์ด๋?" | ๐ซ๏ธ ์์ด์ฝ๋ฆฌ์ |
+| "๋ด์ผ ๋น ์?" | โ
๊ธฐ์์ฒญ |
+| "์ต๊ทผ ์ฌ๋๋ฌธ์ ๋ญ ์์ด?" | ๐ข ์ฌ๋๋ฌธ์ |
+| "์ค๋ ๊ธ์ ๋ญ์ผ?" | ๐ซ ํ๊ต |
+| "๋ค์ ๋ฒ์ค ์ธ์ ์?" | ๐ ๋์ค๊ตํต |
-- **Home Assistant** 2023.1.0 ์ด์ (hacs.json ๋ช
์)
-- **Python** 3.11 ์ด์ (HA ์์ฒด ์๊ตฌ์ฌํญ)
-- **์ธํฐ๋ท ์ฐ๊ฒฐ** (๊ฐ ์๋น์ค API ์ ๊ทผ)
-- ์๋ ์ค์น๋๋ Python ํจํค์ง: `curl_cffi>=0.7.0`, `beautifulsoup4>=4.12.0` (manifest.json ์ ์)
+LLM์ ๋
ธ์ถ ์ ํด๋ ์ผ๋ฐ sensor/event/weather ์ํฐํฐ๋ก ์ ์ ๋์. ์ถ๊ฐ ์ค์ ๋ถํ์.
---
-## โ ์์ฃผ ๋ฌป๋ ์ง๋ฌธ (FAQ)
+## โ FAQ
-Q. 13๊ฐ์ง ์๋น์ค๋ฅผ ์ ๋ถ ๋ฑ๋กํด์ผ ํ๋์?
-
-์๋์. **์ํ๋ ๊ฒ๋ง ๋ฑ๋ก**ํ์๋ฉด ๋ฉ๋๋ค. ํตํฉ ์ถ๊ฐ ํ๋ฉด์์ ๋งค๋ฒ 1๊ฐ ์๋น์ค๋ฅผ ๊ณ ๋ฅด๋ ๋ฐฉ์์ด๋ฏ๋ก, ํ์ํ ๋๋ง๋ค ํ๋์ฉ ๋๋ ค๊ฐ์๋ฉด ๋ฉ๋๋ค. ์ ํ ๋ฑ๋ก ์ ํ ์๋น์ค๋ ์ด๋ค entity๋ ๋ง๋ค์ง ์๊ณ ๋ฆฌ์์ค๋ ์ฐ์ง ์์ต๋๋ค.
+13๊ฐ์ง๋ฅผ ์ ๋ถ ๋ฑ๋กํด์ผ ํ๋์?
+์๋์. ์ํ๋ ๊ฒ๋ง ๋ฑ๋กํ์๋ฉด ๋ฉ๋๋ค. ๋ฑ๋ก ์ ํ ์๋น์ค๋ entityยท๋ฆฌ์์ค๋ฅผ ์ ํ ์ฐ์ง ์์ต๋๋ค.
-Q. ์ฌ์ฉ๋ฃ๊ฐ ๋๋์? ์ ๋ฃ API๊ฐ ์๋์?
-
-**์ ๋ถ ๋ฌด๋ฃ**์
๋๋ค. ์ ๋ถยท๊ณต๊ณต๊ธฐ๊ด(๊ณต๊ณต๋ฐ์ดํฐํฌํธ, ๊ธฐ์์ฒญ, NEIS ๋ฑ)์ด ์ ๊ณตํ๋ OpenAPI๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๋ณธ ์ปดํฌ๋ํธ์ ๋ชจ๋ API๋ ๋ฌด๋ฃ์
๋๋ค. ๋จ, ๊ฐ API๋ **์ผ์ผ ํธ์ถ ํ๋**(๋ณดํต 1๋ง ~ 100๋ง ํ/์ผ)๊ฐ ์์ง๋ง ๊ฐ์ ์ฉ 1์ธ ์ฌ์ฉ์ผ๋ก ํ๋๋ฅผ ๋๊ธฐ๋ ์ผ์ ๊ฑฐ์ ์์ต๋๋ค.
+์ฌ์ฉ๋ฃ๊ฐ ๋๋์?
+**์ ๋ถ ๋ฌด๋ฃ**. ์ ๋ถยท๊ณต๊ณต๊ธฐ๊ด OpenAPI๋ฅผ ์ฌ์ฉํ๋ฉฐ ๋ณธ ์ปดํฌ๋ํธ๋ ๊ฒฐ์ ยท๊ณผ๊ธ ์์. ๊ฐ API๋ ์ผ์ผ ํธ์ถ ํ๋(๋ณดํต 1๋ง~100๋งํ/์ผ)๊ฐ ์์ง๋ง ๊ฐ์ ์ฉ 1์ธ ์ฌ์ฉ์ผ๋ก ๋๊ธฐ๋ ์ผ์ ๊ฑฐ์ ์์ต๋๋ค.
-Q. API ํค ์ ์ฒญ์ด ๋ฌด์์์. ์ ๋ฐ๊ณ ์ธ ์ ์๋ ๊ฒ ์๋์?
-
-๋ค, **API ํค ์์ด ๋ฐ๋ก ๋๋ ์๋น์ค**๊ฐ 4๊ฐ์ง ์์ต๋๋ค:
-- ๐จ **์์ ์๋ฆผ** โ ํ์๋ถ ์์ ์๋ฆผ (์ง์ญ๋ง ์ ํ)
-- โก **ํ๊ตญ์ ๋ ฅ / ๐ง ์๋ฆฌ์ / ๐ ๊ฐ์ค์ฑ** โ ๋ณธ์ธ ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ (API ํค ์๋)
-
-์ด 4๊ฐ๋ก ๋จผ์ ์ปดํฌ๋ํธ๋ฅผ ์ฒดํํด ๋ณด์๊ณ , ๋ง์์ ๋ค๋ฉด [๐ API ํค ๋ฐ๊ธ ๊ฐ์ด๋](#-api-ํค-๋ฐ๊ธ-๊ฐ์ด๋)๋๋ก ๋ค๋ฅธ ์๋น์ค๋ฅผ ์ถ๊ฐํ์๋ฉด ๋ฉ๋๋ค.
+API ํค ์ ์ฒญ์ด ๋ถ๋ด์ค๋ฌ์์
+**ํค ์์ด ๋ฐ๋ก ๋๋ ์๋น์ค 4๊ฐ์ง**๋ถํฐ ์ฒดํํ์ธ์:
+- ๐จ **์์ ์๋ฆผ** โ ์ง์ญ๋ง ์ ํ (ํ์๋ถ ํ์ด์ง ์คํฌ๋ํ)
+- โก **ํ๊ตญ์ ๋ ฅ / ๐ง ์๋ฆฌ์ / ๐ ๊ฐ์ค์ฑ** โ ๋ณธ์ธ ๊ณ์ /๋ฒํธ๋ก ๋ก๊ทธ์ธ (API ํค ์๋)
-Q. ์์ธ์ ์ ์ฌ๋๋ฐ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฐ์?
-
-**๋๋ถ๋ถ ์ ๊ตญ ๊ฐ๋ฅ**ํฉ๋๋ค.
-- ์ ๊ตญ: ์ฝ๊ตญ, ์ฌ๋๋ฌธ์, ์์ ์๋ฆผ, ๊ธฐ์์ฒญ ๋๋ค์๋ณด, ๊ธฐ์ํน๋ณด, ์ง์ง, ์์ด์ฝ๋ฆฌ์, ํ๊ต, ์ ๊ฐ
-- **์์ธ๋ง:** ์๋ฆฌ์(์์๋), ์์ธ ์งํ์ฒ ์ค์๊ฐ ๋์ฐฉ์ ๋ณด
-- ๋์๊ฐ์ค ํ์ฌ๊ฐ ๊ฐ์ค์ฑ๊ณผ ์ฐ๋๋์ด ์์ผ๋ฉด ์ ๊ตญ ๊ฐ๋ฅ
+์์ธ ์ธ ๊ฑฐ์ฃผ์๋ ๊ฐ๋ฅํ๊ฐ์?
+๋๋ถ๋ถ ์ ๊ตญ ๊ฐ๋ฅ. **์์ธ ์ ์ฉ**: ์๋ฆฌ์(์์๋), ์์ธ ์งํ์ฒ ์ค์๊ฐ ๋์ฐฉ์ ๋ณด. ๋๋จธ์ง๋ ์ ๊ตญ OK.
-Q. ํ ๊ฐ์กฑ ์์์ ์ฌ๋ฌ ํ๊ต / ์ฌ๋ฌ ์ฝ๊ตญ ์ง์ญ์ ๋์์ ๋ณด๊ณ ์ถ์ด์.
-
-๊ฐ๋ฅํฉ๋๋ค. **๊ฐ์ ์๋น์ค๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ฑ๋ก**ํ๋ฉด ๊ฐ๊ฐ ๋
๋ฆฝ์ ์ธ ๊ธฐ๊ธฐยทentity๊ฐ ๋ง๋ค์ด์ง๋๋ค.
-- ์: "์ฝ๊ตญ" ์๋น์ค๋ฅผ ์ํฅ์ / ์์์ / ๋ถ๋ชจ๋ ๋ ์๊ตฐ๊ตฌ 3๋ฒ ๋ฑ๋ก โ ๊ธฐ๊ธฐ 3๊ฐ (`์ฝ๊ตญ - ์ํฅ์`, `์ฝ๊ตญ - ์์์`, `์ฝ๊ตญ - ๋ถ๋ชจ๋ ๋๋ค`) ์ ๊ฐ ๊ธฐ๊ธฐ ์๋ ๋ณ๋ `์ด์ ์ฝ๊ตญ ์` sensor ๊ฐ ์์ฑ๋ฉ๋๋ค. (entity_id๋ ์๋์ผ๋ก ๋ก๋ง์ ์ฌ๋ฌ๊ทธํ๋์ด `sensor.yaggug_siheungsi_*` ํํ๊ฐ ๋ฉ๋๋ค.)
+๋ฑ๋กํ API ํคยท์ง์ญ์ ๋ฐ๊พธ๋ ค๋ฉด?
+์ค์ โ ๊ธฐ๊ธฐ ๋ฐ ์๋น์ค โ **"ํ๊ตญ ์ปดํฌ๋ํธ ํคํธ"** ์นด๋ โ ํด๋น ํญ๋ชฉ์ **"๊ตฌ์ฑ"** ๋ฒํผ. ์ญ์ ยท์ฌ๋ฑ๋ก ์์ด entity์ ์๋ํ ์ฐ๊ฒฐ ์ ์ง๋จ.
-Q. ๋ฐ์ดํฐ๋ ์ผ๋ง๋ ์์ฃผ ๊ฐฑ์ ๋๋์? ์ค์๊ฐ์ธ๊ฐ์?
-
-์๋น์ค ์ฑ๊ฒฉ์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. [์
๋ฐ์ดํธ ์ฃผ๊ธฐ ํ](#-์
๋ฐ์ดํธ-์ฃผ๊ธฐ) ์ฐธ๊ณ . ๋น ๋ฅธ ๊ฒ๋ถํฐ ์ ๋ฆฌํ๋ฉด:
-- **1๋ถ ~ 2๋ถ:** ๋ฒ์ค/์งํ์ฒ (์ค์๊ฐ ๋์ฐฉ)
-- **5๋ถ:** ์ฌ๋๋ฌธ์, ์์ ์๋ฆผ, KEPCO
-- **10๋ถ ~ 15๋ถ:** ์ง์ง, ๊ธฐ์ํน๋ณด
-- **20๋ถ ~ 30๋ถ:** ๊ฐ์ค์ฑ, ๊ธฐ์์ฒญ ์๋ณด, ์์ด์ฝ๋ฆฌ์
-- **1์๊ฐ:** ์๋ฆฌ์, ์ฝ๊ตญ, ์ ๊ฐ
-- **6์๊ฐ:** ํ๊ต (๊ธ์ยท์๊ฐํ๋ ์ผ์๋ณ ๋ณํ๊ฐ ์ ์)
-
-> ๐ก ์ฝ๊ตญ์ `open_now`(์ง๊ธ ์์
์ค์ธ๊ฐ)๋ ๋ฐ์ดํฐ ๊ฐฑ์ ๊ณผ ๋ณ๊ฐ๋ก **๋์๋ณด๋์ ํ์๋ ๋๋ง๋ค ์๊ฐยท์์ผ ๊ธฐ์ค์ผ๋ก ์ฌ๊ณ์ฐ**๋ฉ๋๋ค.
+๊ฐ์ ์๋น์ค๋ฅผ ์ฌ๋ฌ ์ง์ญ์ผ๋ก ๋ฑ๋ก ๊ฐ๋ฅ?
+๊ฐ๋ฅํฉ๋๋ค. ์ฝ๊ตญ ์๋น์ค๋ฅผ ์ํฅ์ยท์์์ยท๋ถ๋ชจ๋ ๋ 3๋ฒ ๋ฑ๋กํ๋ฉด ๋
๋ฆฝ์ ์ธ ๊ธฐ๊ธฐยทentity 3์ธํธ๊ฐ ๋ง๋ค์ด์ง๋๋ค.
-Q. ํธ๋ํฐ ์๋ฆผ๊ณผ ํจ๊ป ์ฐ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋์?
+ํธ๋ํฐ ์๋ฆผ๊ณผ ํจ๊ป ์ฐ๋ ค๋ฉด?
-Home Assistant์ **์๋ํ(Automation)** ์ **Companion ์ฑ ํธ์**๋ฅผ ์กฐํฉํ๋ฉด ๋ฉ๋๋ค. ๊ฐ์ฅ ๋จ์ํ ์๋ํ YAML ์์ ๋ ๊ฐ์
๋๋ค. ์ค์ ์ฌ์ฉ ์ `<...>` ๋ถ๋ถ๋ง ๋ณธ์ธ ํ๊ฒฝ์ ๋ง๊ฒ ๋ฐ๊พธ์ธ์.
+HA Automation + Companion ์ฑ ํธ์ ์กฐํฉ. ๊ฐ์ฅ ๋จ์ํ ์์:
```yaml
-# 1) ์ฌ๋๋ฌธ์๊ฐ ์๋ก ๋์ฐฉํ๋ฉด ํธ๋ํฐ์ ํธ์
-# "์ต์ ์ฌ๋๋ฌธ์" sensor์ state๊ฐ ๋ฐ๋ ๋๋ง๋ค ๋ฐ์ฌ
automation:
- - alias: "์ฌ๋๋ฌธ์ ํธ์"
+ - alias: "์ฌ๋๋ฌธ์ โ ํธ๋ํฐ ํธ์"
trigger:
- platform: state
- entity_id: sensor.<์ฌ๋๋ฌธ์_์ต์ _์ํฐํฐ_id> # ๊ฐ๋ฐ์ ๋๊ตฌ โ ์ํ์์ "์ต์ ์ฌ๋๋ฌธ์" ๊ฒ์ํด ๋ณต์ฌ
+ entity_id: sensor.<์ฌ๋๋ฌธ์_์ต์ _์ํฐํฐ_id> # ๊ฐ๋ฐ์ ๋๊ตฌ์์ ํ์ธ
condition:
- condition: template
value_template: "{{ trigger.to_state.state not in ['์์', 'unknown', 'unavailable'] }}"
@@ -703,126 +368,124 @@ automation:
data:
title: "๐จ ์ฌ๋๋ฌธ์"
message: "{{ trigger.to_state.state }}"
-
-# 2) PM2.5 > 35 ใ/ใฅ ์ด๋ฉด ๊ฑฐ์ค TTS + ํธ์
- - alias: "๋ฏธ์ธ๋จผ์ง ๋์จ ์๋ฆผ"
- trigger:
- - platform: numeric_state
- entity_id: sensor.<์ธก์ ์_pm25_์ํฐํฐ_id> # "PM2.5 ์ด๋ฏธ์ธ๋จผ์ง" ๊ฒ์ํด ๋ณต์ฌ
- above: 35
- action:
- - service: tts.cloud_say
- data:
- entity_id: media_player.<์คํผ์ปค_์ํฐํฐ_id>
- message: "ํ์ฌ ๋ฏธ์ธ๋จผ์ง ์์น๊ฐ ๋์จ ๋จ๊ณ์
๋๋ค. ํ๊ธฐ๋ฅผ ์์ ํ์ธ์."
- - service: notify.mobile_app_<ํฐ_์ด๋ฆ>
- data:
- message: "PM2.5 {{ states(trigger.entity_id) }} ใ/ใฅ"
```
-
-> ๐ก **์นํ ์ด๋ฆ โ entity_id ๋ณํ๋ฒ**: HA ์ฌ์ด๋๋ฐ์ ๐ ๏ธ **๊ฐ๋ฐ์ ๋๊ตฌ โ ์ํ** ํญ์์ ๊ฒ์์ฐฝ์ ์นํ ์ด๋ฆ(`์ต์ ์ฌ๋๋ฌธ์`, `PM2.5 ์ด๋ฏธ์ธ๋จผ์ง` ๋ฑ)์ ์
๋ ฅํ๋ฉด ์ข์ธก์ entity_id๊ฐ ํ์๋ฉ๋๋ค. ๊ทธ ID๋ฅผ ์ YAML์ `<...>` ์๋ฆฌ์ ๋ถ์ฌ๋ฃ์ผ์ธ์. HA์ ์๋ํ ํธ์ง UI(์๊ฐ์ )์์๋ ์นํ ์ด๋ฆ์ผ๋ก ๋ฐ๋ก ์ ํํ ์๋ ์์ด ๋ ํธํฉ๋๋ค.
-
-์๋ํ ๋ง๋๋ ๋ฐฉ๋ฒ ์ ๋ฐ์ [HA ์๋ํ ๊ฐ์ด๋](https://www.home-assistant.io/docs/automation/) ์ฐธ๊ณ .
-
-Q. ๋ฑ๋ก ํ์ API ํค๋ฅผ ๋ฐ๊พธ๊ฑฐ๋ ์ง์ญ์ ์ถ๊ฐ/์ญ์ ํ๋ ค๋ฉด ๋ค์ ๋ฑ๋กํด์ผ ํ๋์?
-
-์๋๋๋ค. **์ค์ โ ๊ธฐ๊ธฐ ๋ฐ ์๋น์ค โ "ํ๊ตญ ์ปดํฌ๋ํธ ํคํธ"** ์นด๋์์ ํด๋น ํญ๋ชฉ ์ **"๊ตฌ์ฑ"** ๋ฒํผ์ ๋๋ฅด๋ฉด ์๋ ์
๋ ฅํ๋ ๊ฐ(API ํคยท์ง์ญยท์ ์ข
ยท์ขํ ๋ฑ)์ ๊ทธ๋๋ก ํธ์งํ ์ ์์ต๋๋ค (Options Flow ์ง์). ๊ธฐ์กด entity์ ์๋ํ ์ฐ๊ฒฐ์ ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค.
+์
๋ ฅํ ๋น๋ฐ๋ฒํธยทํค๋ ์ด๋ ์ ์ฅ๋๋์?
+Home Assistant ๋ด๋ถ ์ ์ฅ์ (`.storage/`) ์๋ง ์ ์ฅ๋๋ฉฐ ์ธ๋ถ๋ก ์ ์ก๋์ง ์์ต๋๋ค. ์
๋ ฅํ ๋น๋ฐ๋ฒํธ๋ API ํธ์ถ ์ ํด๋น ์๋น์ค(ํ์ ยท์๋ฆฌ์ ๋ฑ)์ ๊ณต์ ํ์ด์ง์๋ง ์ฌ์ฉ๋ฉ๋๋ค.
-Q. "์ง๊ธ ๋ฏธ์ธ๋จผ์ง ์ด๋?" ๊ฐ์ ์์ฑ ์ง๋ฌธ๋ ๊ฐ๋ฅํ๊ฐ์?
-
-๋ค, Home Assistant์ **Assist + LLM ํตํฉ** (OpenAI / Google / Ollama ๋ฑ)์ ๋ณธ ์ปดํฌ๋ํธ๋ฅผ ๋
ธ์ถํ๋ฉด ์์ฐ์ด ์ง๋ฌธ์ด ๊ฐ๋ฅํฉ๋๋ค. ์์ธํ ์์๋ [๐ค LLM API ์ฐ๋](#-llm-api-์ฐ๋-์ต์
) ์น์
์ฐธ๊ณ .
+์
๋ฐ์ดํธ๋ ์ด๋ป๊ฒ ๋ฐ๋์?
+HACS๋ก ์ค์นํ์
จ๋ค๋ฉด ์ ๋ฆด๋ฆฌ์ฆ ์ **HACS โ ํตํฉ โ KR Component Kit** ์ ๋นจ๊ฐ ์ ํ์ โ UPDATE โ HA ์ฌ์์. ๊ธฐ์กด ์ค์ ยทentity ์ ์ง๋จ.
-Q. ๋ฑ๋กํ ์ ๋ณด(ID/๋น๋ฐ๋ฒํธ/API ํค)๋ ์ด๋์ ์ ์ฅ๋๋์? ์์ ํ๊ฐ์?
-
-**Home Assistant ๋ด๋ถ ์ ์ฅ์(config ํด๋ ์ `.storage/`)** ์๋ง ์ ์ฅ๋๋ฉฐ ์ธ๋ถ๋ก ์ ์ก๋์ง ์์ต๋๋ค. ์
๋ ฅํ ๋น๋ฐ๋ฒํธ๋ API ํธ์ถ ์ ํด๋น ์๋น์ค(ํ์ ยท์๋ฆฌ์ ๋ฑ)์ ๊ณต์ ๋ก๊ทธ์ธ ํ์ด์ง์๋ง ์ฌ์ฉ๋ฉ๋๋ค. ์์ธํ ์ฑ
์ ํ๊ณ๋ ์๋ ๋ฉด์ฑ
์กฐํญ ์น์
์ฐธ๊ณ .
+์ ์ถ ์ํํธ์ธ๋ฐ ์๊ตฐ๊ตฌ ๋ชฉ๋ก์ ๋ด ๋์ด ์์ด์
+ํ์ ๊ตฌ์ญ ์ฝ๋๊ฐ ์ ์ถ ๋๊น์ง ์ฆ์ ๋ฐ์๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ๊ฐ์ฅ ๊ฐ๊น์ด ์ธ์ ๋/๊ตฌ๋ฅผ ์ ํํด ์ฃผ์ธ์. ๊ธฐ์์ฒญ ๋๋ค์๋ณด๋ 5kmร5km ๊ฒฉ์๋ผ ์ธ์ ์ฝ๋ ์ ํํด๋ ์ค์ ๋ ์จ ๊ฑฐ์ ๋์ผ.
-
-Q. ํ ๋ฒ ๋ฑ๋กํ ์๋น์ค๋ฅผ ์ญ์ ํ๊ฑฐ๋ ๋ค์ ์ค์ ํ๊ณ ์ถ์ด์.
+---
-**์ค์ โ ๊ธฐ๊ธฐ ๋ฐ ์๋น์ค โ "ํ๊ตญ ์ปดํฌ๋ํธ ํคํธ"** ์นด๋์ ๋ฑ๋ก๋ ํญ๋ชฉ ์ **โฎ โ ์ญ์ ** ๋ฅผ ๋๋ฅด๋ฉด ํด๋น ํญ๋ชฉ๊ณผ ๊ทธ ์๋น์ค์ ๋ชจ๋ entity๊ฐ ๊น๋ํ๊ฒ ์ ๊ฑฐ๋ฉ๋๋ค. ๋ค์ ๋ฑ๋กํ๋ ค๋ฉด ํตํฉ ์ถ๊ฐ๋ฅผ ๋ฐ๋ณตํ์๋ฉด ๋ฉ๋๋ค.
+## ๐ ์
๋ฐ์ดํธ ์ฃผ๊ธฐ
-> ๐ก ์
๋ ฅ๊ฐ๋ง ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด **์ญ์ ๋์ "๊ตฌ์ฑ"** ๋ฒํผ์ด ๋ ํธํฉ๋๋ค (entity ์ ์ง๋จ).
+| ์นดํ
๊ณ ๋ฆฌ | ์๋น์ค | ์ฃผ๊ธฐ |
+|---|---|---|
+| ์ค์๊ฐ | ๋ฒ์ค/์งํ์ฒ | 1~2๋ถ |
+| ์์ ยท์ฌ๋ | ์ฌ๋๋ฌธ์, ์์ ์๋ฆผ, KEPCO | 5๋ถ |
+| ์์ ยท์ฌ๋ | ์ง์ง, ๊ธฐ์ํน๋ณด | 10~15๋ถ |
+| ํ๊ฒฝ/์ ํธ | ๊ฐ์ค์ฑ, ๊ธฐ์์ฒญ ์๋ณด, ์์ด์ฝ๋ฆฌ์ | 20~30๋ถ |
+| ์ํ | ์๋ฆฌ์, ์ฝ๊ตญ, ์ ๊ฐ | 1์๊ฐ |
+| ์ํ | ํ๊ต (๊ธ์ยท์๊ฐํ) | 6์๊ฐ |
-
+> ๐ก ์ฝ๊ตญ `open_now`(์ง๊ธ ์์
์ค) ๋ ๋ฐ์ดํฐ ๊ฐฑ์ ๊ณผ ๋ณ๊ฐ๋ก **๋์๋ณด๋ ๋ ๋ ์๋ง๋ค ์ค์๊ฐ ์ฌ๊ณ์ฐ**.
-
-Q. ์ ์ถ ์ํํธ์ธ๋ฐ ์๊ตฐ๊ตฌ ๋ชฉ๋ก์ ๋ด ๋์ด ์์ด์.
+---
-ํ์ ๊ตฌ์ญ ์ฝ๋๊ฐ ์ ๋์ ์ ์ถ ๋๊น์ง ์ฆ์ ๋ฐ์๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. **๊ฐ์ฅ ๊ฐ๊น์ด ์ธ์ ๋/๊ตฌ ์ฝ๋**๋ฅผ ์ ํํด ์ฃผ์ธ์. ๊ธฐ์์ฒญ ๋๋ค์๋ณด๋ ๊ฒฉ์ ๋จ์(5km ร 5km)์ด๋ฏ๋ก ์ธ์ ์ฝ๋๋ฅผ ๊ณจ๋ผ๋ ์ค์ ๋ ์จ๋ ๊ฑฐ์ ๋์ผํฉ๋๋ค.
+## โ ๏ธ ์๋ ค์ง ํ๊ณ (์ ์งํ ๊ณต๊ฐ)
-
+๋ณธ ์ปดํฌ๋ํธ๋ ์ผ๋ถ ์๋น์ค์์ ๋น๊ณต์ ๊ฒฝ๋ก(์คํฌ๋ํยท๋ชจ๋ฐ์ผ ์ฑ API)๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ธ๋ถ ์ฌ์ดํธ ๋ณ๊ฒฝ ์ ์ผ์์ ์ผ๋ก ๊นจ์ง ์ ์๋ ์ฝ์ ์ ๋ชจ๋ ๊ณต๊ฐํฉ๋๋ค.
-
-Q. ์
๋ฐ์ดํธ๋ ์ด๋ป๊ฒ ๋ฐ๋์?
+| ์๋น์ค | ํ๊ณ |
+|---|---|
+| ๐จ **์์ ์๋ฆผ / ๐ข ์ฌ๋๋ฌธ์** | `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` ์๋ต์ ์๋ฌ๋ก ์ฒ๋ฆฌ โ ์ผ์ ์๋ฌ ๋ก๊ทธ ๊ฐ๋ฅ (์ค์ ๋์์๋ ์ํฅ ์ ์) |
-HACS๋ก ์ค์นํ ๊ฒฝ์ฐ, ์ ๋ฆด๋ฆฌ์ฆ๊ฐ ๋์ค๋ฉด **HACS โ ํตํฉ โ KR Component Kit** ์ ๋นจ๊ฐ ์ ์ด ํ์๋ฉ๋๋ค. ํด๋ฆญ โ UPDATE โ HA ์ฌ์์์ด๋ฉด ๋์
๋๋ค. ๊ธฐ์กด ์ค์ ๊ณผ entity๋ ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค.
+> โ
**๊ฒ์ฆ ์๋ฃ**: ์ฝ๊ตญ (์ํฅ์ โ ์ค์ sensor state=20, 20๊ฐ ์ฝ๊ตญ attribute ์ ์). ์์ ์๋ฆผ (์ํฅ์ ์ํ๋ cascading ๋ฑ๋ก ์ฑ๊ณต).
-
+> ๐ **์ฌ์ดํธ ๋ณ๊ฒฝ์ผ๋ก ๊นจ์ก๋ค๋ฉด** [GitHub Issues](https://github.com/redchupa/kr_component_kit/issues)์ ์๋ ค์ฃผ์ธ์. ๋น ๋ฅด๊ฒ ์์ PR ์์ฑํฉ๋๋ค.
---
## ๐ ๋ฌธ์ ํด๊ฒฐ
+### API ํค ์ธ์ฆ ์คํจ
+- ์ ์ฒญ ํ ํ์ฑํ๊น์ง **1~2์๊ฐ** ๋๊ธฐ (ํนํ ์ด์๊ธฐ๊ด ํค)
+- `data.go.kr` ์์์๋ **๋ฐ์ดํฐ์
๋ณ ํ์ฉ์ ์ฒญ ๋ณ๋** โ ์ฝ๊ตญ ํค๋ก ๊ธฐ์ํน๋ณด ํธ์ถํ๋ฉด 403
+- ์ฌ๋๋ฌธ์๋ `safetydata.go.kr` ๋ณ๋ ํฌํธ โ `data.go.kr` ํค๋ก๋ ์ ๋จ
+- `401` = ํค ์์ฒด๊ฐ ์๋ชป, `403` = ํค๋ ๋ง์ง๋ง ํด๋น ๋ฐ์ดํฐ์
ํ์ฉ์ ์ฒญ ์ ๋จ
+- ์ผ์ผ ํธ๋ํฝ ํ๋ ์ด๊ณผ๋ ๋์ผ ์ฆ์ (๋ง์ดํ์ด์ง์์ ํ์ธ)
+
### ๋ก๊ทธ์ธ ์คํจ (KEPCO / ์๋ฆฌ์ / ๊ฐ์ค์ฑ)
-- ์น์ฌ์ดํธ์์ ์ง์ ๋ก๊ทธ์ธ์ด ๋๋์ง ํ์ธ
-- 2์ฐจ ์ธ์ฆ(OTP) ์ค์ ๋ ๊ณ์ ์ ์ง์ํ์ง ์์
-- ๊ฐ์ค์ฑ์ ํ ํฐ์ด ์์ฃผ ๋ง๋ฃ๋ ์ ์์ โ ์ฑ์์ ๋ค์ ๋ฐ๊ธ
+- ์น์ฌ์ดํธ์์ ์ง์ ๋ก๊ทธ์ธ ๊ฐ๋ฅํ์ง ํ์ธ
+- 2์ฐจ ์ธ์ฆ(OTP) ์ค์ ๋ ๊ณ์ ์ ๋ฏธ์ง์
+- ๊ฐ์ค์ฑ์ ํ ํฐ์ด ์์ฃผ ๋ง๋ฃ โ ์ฑ์์ ๋ค์ ๋ฐ๊ธ
-### API ํค ์ธ์ฆ ์คํจ
-- ์ ์ฒญ ์งํ 1~2์๊ฐ ํ์ฑํ ๋๊ธฐ ์๊ฐ์ด ์์ ์ ์์ (ํนํ `data.go.kr` ์ด์๊ธฐ๊ด ํค)
-- `data.go.kr` ์์์๋ **๋ฐ์ดํฐ์
๋ณ๋ก ํ์ฉ์ ์ฒญ์ด ๋ณ๋** โ ์ฝ๊ตญ ํค์ ๊ธฐ์ํน๋ณด ํค๋ ๊ฐ์ ์ธ์ฆํค์ฌ๋ *๊ฐ ๋ฐ์ดํฐ์
์ ์ ์ฒญ ์น์ธ*์ด ๋ฐ๋ก ํ์ํฉ๋๋ค
-- **์ฌ๋๋ฌธ์๋ง์ `safetydata.go.kr` ๋ณ๋ ํฌํธ** โ ๊ณต๊ณต๋ฐ์ดํฐํฌํธ ํค๋ก๋ ์ ๋ฉ๋๋ค
-- `401`์ ํค ์์ฒด๊ฐ ์๋ชป๋ ๊ฒฝ์ฐ, `403`์ ํค๋ ๋ง์ง๋ง ํด๋น ๋ฐ์ดํฐ์
ํ์ฉ ์ ์ฒญ์ด ์ ๋ ๊ฒฝ์ฐ์
๋๋ค
-- ์ผ์ผ ์์ฒญ ํ๋(ํธ๋ํฝ) ์ด๊ณผ๋ ๋์ผ ์ฆ์์ผ๋ก ๋ํ๋๋ ๋ง์ดํ์ด์ง ํต๊ณ ํ์ธ
+### ๋ฐ์ดํฐ๊ฐ ๋น์ด์์ ๋ (์์ ์๋ฆผ / ์ฌ๋๋ฌธ์)
+- ๋ฑ๋กํ ์ง์ญ์ ์ต๊ทผ ๋ฉ์์ง๊ฐ ์์ผ๋ฉด sensor state๊ฐ `์์` โ ์ ์ ๋์
+- ์ ๋ถ ์ฌ์ดํธ ์ ๊ฒ ์ค์ด๋ฉด ์ ์ ํ ์๋ ๋ณต๊ตฌ
-### ์์ ์๋ฆผ / ์ฌ๋๋ฌธ์ ๋ฐ์ดํฐ๊ฐ ๋น์ด์์ ๋
-- ์์ ์๋ฆผ์ `safekorea.go.kr` ํ์ด์ง๋ฅผ ์คํฌ๋ํํฉ๋๋ค. ํด๋น ์ฌ์ดํธ ์ ๊ฒ ์ค์ด๋ฉด ์ผ์์ ์ผ๋ก ๋น ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์์ โ ์ ์ ํ ์๋ ๋ณต๊ตฌ
-- ์ฌ๋๋ฌธ์๋ `safetydata.go.kr` API๊ฐ ์ ๊ธฐ ์ ๊ฒ ์ค์ผ ์ ์์ โ [์ ๊ฒ ๊ณต์ง](https://www.safetydata.go.kr)์์ ํ์ธ
-- ๋ฑ๋กํ ์ง์ญ์ ์ต๊ทผ ๋ฐ์ก๋ ๋ฉ์์ง๊ฐ ์์ผ๋ฉด sensor state๊ฐ `์์` ์ผ๋ก ํ์๋ฉ๋๋ค (์ ์ ๋์)
+### ๊ทธ๋๋ ์ ํ๋ฆฌ๋ฉด
-### ๋ฐ์ดํฐ ์
๋ฐ์ดํธ ์๋จ
-- Home Assistant ๋ก๊ทธ(**์ค์ โ ์์คํ
โ ๋ก๊ทธ**)์์ `kr_component_kit` ๊ฒ์
-- ๊ฐ ์๋น์ค API ์ฅ์ ์ฌ๋ถ ํ์ธ (`data.go.kr`, KMA ๋ฑ์ ์ ๊ธฐ ์ ๊ฒ์ด ์ฆ์)
+1. **๋ก๊ทธ ํ์ธ** โ ์ค์ โ ์์คํ
โ ๋ก๊ทธ ์์ `kr_component_kit` ๊ฒ์
+2. **์ด์ ๋ฑ๋ก** โ [GitHub Issues](https://github.com/redchupa/kr_component_kit/issues) โ ๋ค์ ์ ๋ณด ํฌํจ:
+ - ์ด๋ค ์๋น์ค (์: "์ฝ๊ตญ โ ์์ธ ๊ฐ๋จ๊ตฌ")
+ - HA ๋ฒ์ + ๋ณธ ์ปดํฌ๋ํธ ๋ฒ์
+ - ๋ก๊ทธ ์๋ฌ (๊ฐ์ธ์ ๋ณดยทํค๋ ๊ฐ๋ฆฐ ํ)
+ - ์๋ํ ๋จ๊ณ
-### ๊ธฐ์์ฒญ / ์ฝ๊ตญ ์ขํ๊ฐ ์ ๋ง์ ๋
-- ์๋ โ ์๊ตฐ๊ตฌ ์ ํ ์ **๊ณต์ ํ์ ๊ตฌ์ญ ์ฝ๋**๋ฅผ ๋ฐ๋ฅด๋ฏ๋ก, ๊ฑฐ์ฃผ์ง ์ฝ๋์ ํ์ ๊ตฌ์ญ ์ฝ๋๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ(์: ์ ๋์ ์ ์ถ ๋) ์ธ์ ์ฝ๋๋ฅผ ์ ํํ์๋ฉด ๋ฉ๋๋ค
+> ๐ฌ ํ๊ตญ์ด ๊ทธ๋๋ก ์์ฑํด์ฃผ์
๋ ๋ฉ๋๋ค. ๋ต๋ณ๋ ํ๊ตญ์ด๋ก.
-### ๊ทธ๋๋ ์ ํ๋ฆฐ๋ค๋ฉด โ ์ด๋์ ๋ฌผ์ด๋ณด๋์?
+---
-1. **๋ก๊ทธ ์ฒจ๋ถ๊ฐ ์ฐ์ ** โ **์ค์ โ ์์คํ
โ ๋ก๊ทธ** ์์ `kr_component_kit` ์ผ๋ก ๊ฒ์ํด ๋นจ๊ฐ ์ค(์๋ฌ)์ ๋ณต์ฌ
-2. [GitHub Issues](https://github.com/redchupa/kr_component_kit/issues) ์ ์ ์ด์ ์์ฑ โ ๋ค์ ์ ๋ณด๋ฅผ ํจ๊ป ์ ์ด์ฃผ์๋ฉด ๋น ๋ฅด๊ฒ ํด๊ฒฐ๋ฉ๋๋ค:
- - ์ด๋ค ์๋น์ค๋ฅผ ๋ฑ๋กํ๋ ค ํ๋์ง (์: "์ฝ๊ตญ โ ์์ธํน๋ณ์ ๊ฐ๋จ๊ตฌ")
- - HA ๋ฒ์ / ์ด ์ปดํฌ๋ํธ ๋ฒ์
- - ๋ก๊ทธ ์๋ฌ ๋ฉ์์ง (๊ฐ์ธ์ ๋ณดยทAPI ํค๋ ๊ฐ๋ฆฐ ํ)
- - ์๋ํด๋ณธ ๋จ๊ณ
+## ๐ ์๊ตฌ์ฌํญ
-> ๐ฌ ํ๊ตญ์ด ๊ทธ๋๋ก ์์ฑํ์
๋ ๋ฉ๋๋ค. ๋ต๋ณ๋ ํ๊ตญ์ด๋ก ๋๋ฆฝ๋๋ค.
+- **Home Assistant** 2023.1.0 ์ด์
+- **Python** 3.11 ์ด์ (HA ์์ฒด ์๊ตฌ์ฌํญ)
+- **์ธํฐ๋ท ์ฐ๊ฒฐ** (๊ฐ ์๋น์ค API ์ ๊ทผ)
+- ์๋ ์ค์น ํจํค์ง: `curl_cffi>=0.7.0`, `beautifulsoup4>=4.12.0` (manifest.json ์ ์)
---
## โ ๏ธ ๋ฉด์ฑ
์กฐํญ
-- ์ด ํ๋ก์ ํธ๋ ์ผ๋ถ ์๋น์ค์์ ๊ณต์ API๊ฐ ์๋ **์ธ์ฆ๋ ์น ์คํฌ๋ํ** ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค (KEPCO, ์๋ฆฌ์, ๊ฐ์ค์ฑ)
+- ๋ณธ ์ปดํฌ๋ํธ๋ ์ผ๋ถ ์๋น์ค์์ ๊ณต์ API๊ฐ ์๋ **์ธ์ฆ๋ ์น ์คํฌ๋ํ / ๋ชจ๋ฐ์ผ ์ฑ ๋ด๋ถ API** ๋ฅผ ์ฌ์ฉํฉ๋๋ค (KEPCO, ์๋ฆฌ์, ๊ฐ์ค์ฑ, ์์ ์๋ฆผ)
- ๊ฐ ์๋น์ค ์ ๊ณต์
์ฒด์ ์ ์ฑ
๋ณ๊ฒฝ์ ๋ฐ๋ผ ๋์ํ์ง ์์ ์ ์์ต๋๋ค
-- ๊ฐ์ธ์ ๋ณด(ID/๋น๋ฐ๋ฒํธ/ํ ํฐ)๋ Home Assistant ๋ด๋ถ ์ ์ฅ์์๋ง ๋ณด๊ด๋๋ฉฐ ์ธ๋ถ๋ก ์ ์ก๋์ง ์์ต๋๋ค
-- ์ฌ์ฉ์์ ์ฑ
์ ํ์ ์ด์ฉํด์ฃผ์ธ์
+- ์ ๋ถ ์ฌ์ดํธ ์ผ๋ถ๋ TLS ๊ฒ์ฆ ์ฐํ (`verify=False`) โ ์ ๋ถ ์ฌ์ดํธ์ TLS ์ค์ ํธํ์ฑ ์ด์ ํํผ์ฉ. ๋ณด์์ ๋ฏผ๊ฐํ์๋ฉด ์ฝ๋๋ฅผ ์ง์ ํ์ธํด ์ฃผ์ธ์
+- ๊ฐ์ธ์ ๋ณด(ID/๋น๋ฐ๋ฒํธ/ํ ํฐ/API ํค)๋ Home Assistant ๋ด๋ถ ์ ์ฅ์์๋ง ๋ณด๊ด๋๋ฉฐ ์ธ๋ถ ์ ์ก ์์
+- ๋ณธ ํ๋ก์ ํธ๋ ์ ๋ถยท๊ณต๊ณต๊ธฐ๊ด๊ณผ ๋ฌด๊ดํ **๋น๊ณต์ ์๋ํํฐ ํตํฉ**. ์ฌ์ฉ์์ ์ฑ
์ ํ์ ์ด์ฉํด ์ฃผ์ธ์.
+
+---
+
+## ๐ค ๊ธฐ์ฌ / ๋ผ์ด์ ์ค
+
+- ๋ผ์ด์ ์ค: [MIT](LICENSE) โ ์์ ๋กญ๊ฒ ์ฌ์ฉยท์์ ยท์ฌ๋ฐฐํฌ ๊ฐ๋ฅ
+- ์ด์ยทPR ํ์:
+- ์ ํ๊ตญ ์๋น์ค ์ถ๊ฐ ์ ์๋ ํ์ํฉ๋๋ค
---
## โญ ๋์์ด ๋์
จ๋ค๋ฉด
-์ค๋ฅธ์ชฝ ์๋จ **Star โญ** ๋ฒํผ์ ๋๋ฌ์ฃผ์ธ์. ๋ณ์ด ๋ชจ์ด๋ฉด HACS Default Repository ๋ฑ๋ก ๊ฐ๋ฅ์ฑ์ด ์ฌ๋ผ๊ฐ๊ณ , ๋ ๋ง์ ํ๊ตญ ์ฌ์ฉ์๊ฐ ๋ฐ๊ฒฌํ ์ ์๊ฒ ๋ฉ๋๋ค.
+์ค๋ฅธ์ชฝ ์๋จ **Star โญ** ํ ๋ฒ์ด๋ฉด ํฐ ๋์์ด ๋ฉ๋๋ค. ๋ณ์ด ๋ชจ์ด๋ฉด HACS Default Repository ๋ฑ๋ก ๊ฐ๋ฅ์ฑ์ด ์ฌ๋ผ๊ฐ๊ณ , ๋ ๋ง์ ํ๊ตญ ์ฌ์ฉ์๊ฐ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค.
[](https://star-history.com/#redchupa/kr_component_kit&Date)
@@ -830,7 +493,7 @@ HACS๋ก ์ค์นํ ๊ฒฝ์ฐ, ์ ๋ฆด๋ฆฌ์ฆ๊ฐ ๋์ค๋ฉด **HACS โ ํตํฉ โ KR Co
## โ ํ์
-์ด ํ๋ก์ ํธ๊ฐ ๋์์ด ๋์
จ๋ค๋ฉด ์ปคํผ ํ ์์ผ๋ก ์์ํด์ฃผ์ธ์! ๐
+์ด ํ๋ก์ ํธ๊ฐ ๋์์ด ๋์
จ๋ค๋ฉด ์ปคํผ ํ ์์ผ๋ก ์์ํด ์ฃผ์ธ์ ๐