기상정보 API 활용하기 2 – 라즈베리 피코 보드에서 직접접속 방법 및 응답결과 활용

기상정보 API 활용하기 2 – 라즈베리 피코 보드에서 직접접속 방법 및 응답결과 활용

앞선 글에서 기상청의 단기 예보 API를 이용하는 방법을 소개했었다. 해당 글을 통해 기상청의 API 이용을 신청하는 방법과, 주요 parameter들, 그리고 브라우저에서 JSON형으로 결과를 받는 것까지를 소개한 바 있다.

https://blog.naver.com/mythee1/223208832718

이렇게 브라우저에서 보았던 API의 응답 결과를 라즈베리 파이 피코 W 보드에서도 직접 받아서 활용할 수가 있다.

이를 위해서는

우선 다음 라이브러리 사용을 선언해 준다.

import network

import utime

import urequests

그리고 다음의 코드로 네트워크에 연결해 준다.

wlan = network.WLAN(network.STA_IF)

wlan.active(True)

SSID = “SSID”

PASSWORD = “PASSWORD”

wlan.connect(SSID, PASSWORD)

그리고, 기상청 API에 보낼 인자들을 포함하는 문자열을 만들었는데,

먼저 기준 날짜를 localtime() 함수에서 받은 후, 이에 해당되는 문자열을 만들었다. 참고로 파이썬에는 날짜의 포맷을 다루는 함수인 strftime 함수가 있는 것으로 알려져 있는데, 컴맹 수준의 나로서는 마이크로 파이썬에서는 이와 유사한 적절한 함수를 찾지 못해, localtime 함수에서 생성된 인자들을 하나씩 추출해서 재조합하는 과정을 거쳤다.

now=utime.localtime()

year=str(now[0])

month=str(now[1])

if len(month)<2:

month=”0″+ month

date=str(now[2])

if len(date)<2:

date=”0″+ date

base_date=year+month+date

검색 기준 시간은 일단 02시로 고정했다. 기상청은 02시부터 3시간 간격으로 하루에 8번 예보를 발표하는 것으로 알려져 있는 점을 고려했다.

base_time=”0200″

그리고 예측의 수와 연관된 numOfRows는 24시간을 전제로 12항목 * 24 +2의 공식을 이용해 290개로 설정했다. 각 시간별 예보가 12항목인 점과, 일중 최저 온도와 최고온도로 2개가 추가됨을 고려했다. 위치 좌표는 기존과 동일한 경기도 하남시의 한 곳의 좌표를 이용했다.

numOfRows=290

pageNo=1

nx=55

ny=127

위의 서 만든 값들을 토대로 다음 5개의 문자열 조각을 만들었고,

apiaddress=”http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getVilageFcst?”

mykey=”serviceKey=”+”기상청에서 발급받은 접속인증문자열”

I_format=”&numOfRows=”+str(numOfRows)+”&pageNo=”+str(pageNo)+”&dataType=JSON”

S_point=”&base_date=”+str(base_date)+”&base_time=”+str(base_time)

whereisit=”&nx=”+str(nx)+”&ny=”+str(ny)

이들을 이용해 기상청 API에 다음과 같은 방식으로 응답 요청을 했다.

yebo = urequests.get(apiaddress+mykey+I_format+S_point+whereisit).json()

응답 결과는 yebo라는 개체로 받게 되는데, 특정한 값을 사용하려면 다음과 같은 형태로 불러 사용하면 된다.

yebo[‘response’][‘body’][‘items’][‘item’][i][‘fcstValue’]

이러한 구조는 다음과 같이 브라우저를 통해서 보았던 API 응답메시지 내부의 구조를 참조하면 되며, 여기서 사용하는 i 값은 numOfRows 값의 범위에서 변화시키면 된다.

응답받은 결과들 중 fcstDate, fcstTime, category, fcstValue를 쭉 출력해 보면 다음과 같다.

다만 이 중에서 최저 온도에 해당되는 TMN과 최고온도인 TMX는 잘 눈에 띄지 않는다. 하루에 각각 한 개씩 밖에 없기 때문이다.

위에서 설명한 방법을 토대로, 피코 보드로 불러들인 예보 값을 활용하기 위해,

편의상 그날의 최저 온도와 최고온도를 발췌하여 표시하도록 다음과 같은 코드를 만들었다.

import network
import utime
import urequests

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.scan( ) #--> Scan

SSID = "SSID"
PASSWORD = "PASSWORD"
wlan.connect(SSID, PASSWORD)
while not wlan.isconnected() and wlan.status() >= 0:
print("Waiting to connect:")
    utime.sleep(2)
if wlan.status() != 3:
    raise RuntimeError('network connection failed')
else:
print("Wifi is connected == ", wlan.isconnected(), "ip =", wlan.ifconfig())

now=utime.localtime()
year=str(now[0])
month=str(now[1])
if len(month)<2:
    month="0"+ month        
date=str(now[2])
if len(date)<2:
    date="0"+ date

base_time="0200"   
base_date=year+month+date    

numOfRows=290
pageNo=1
nx=55
ny=127

apiaddress="http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getVilageFcst?"
mykey="serviceKey="+"기상청에서 발급받은 접속키 문자열"
I_format="&numOfRows="+str(numOfRows)+"&pageNo="+str(pageNo)+"&dataType=JSON"
S_point="&base_date="+str(base_date)+"&base_time="+str(base_time)
whereisit="&nx="+str(nx)+"&ny="+str(ny)

yebo = urequests.get(apiaddress+mykey+I_format+S_point+whereisit).json()
number = yebo['response']['body']['numOfRows']
print ("예측기준일시", base_date, base_time)
for i in range(number):
if (yebo['response']['body']['items']['item'][i]['category'])=="TMX":
TMX=yebo['response']['body']['items']['item'][i]['fcstValue']
if (yebo['response']['body']['items']['item'][i]['category'])=="TMN":
TMN=yebo['response']['body']['items']['item'][i]['fcstValue']
print("금일중 최저온도=", TMN, "최고온도=", TMX)

wlan.disconnect( )

출력 결과는 다음과 같다.