-
라즈베리파이와 챗봇으로 날씨 예보를 해보자 #3삽질기/라즈베리파이 2020. 2. 17. 00:10
코딩을 하기까지 준비기간이 길었다. 이번에 쓸 코드도 코드 자체로는 크게 어렵지 않지만 디버깅하는 데에 꽤 오랜 시간이 걸렸다. 이번 포스팅에선 API를 사용하면서 했던 고민들과 내 나름대로의 처리들을 적어보도록 하겠다.
kyc3492/RaspberryPiChatBotPython
Contribute to kyc3492/RaspberryPiChatBotPython development by creating an account on GitHub.
github.com
위 링크는 내가 작성했던 코드의 깃허브이다. 해당 코드를 바탕으로 처리를 위해 고민했던 부분을 몇가지 간추려 보도록 하겠다. 해당 코드에서 개선점이나 잘못된 부분이 있다면 피드백 해주시면 좋겠다.
now_time = now.strftime('%H') print(now_time) int_baseTime = int(now_time) - 2 if(int_baseTime > 0): if(int_baseTime % 3 == 1): int_baseTime += 1 elif(int_baseTime % 3 == 2): pass else: int_baseTime += 2 else: int_baseTime = 23 if(int_baseTime < 10): base_time = '0' + str(int_baseTime) + '00' else: base_time = str(int_baseTime) + '00'
날짜와 시간을 조정하는 부분이다. 시스템 시간을 받아와서(now_time) 2를 빼고 3의 배수인지 확인하는데, 이는 가이드 문서에서 명시한 예보시간에 맞추기 위함이다. 현재 시스템 시간에서 02시부터 23시까지 8차례의 예보 시간들 중 가장 최신의 예보를 가져오려고 한 것인데, 여기서 2시간씩 빼면 00시부터 21시까지 모두 3으로 나누었을 때 나머지가 없음을 이용한다.
if(int(now_time) > 23 or int(now_time) < 3): yesterday_date = now - datetime.timedelta(1) now_date = yesterday_date.strftime('%Y%m%d') print(base_time)
또한 날짜 변화에도 신경을 써 주어야 했다. 자칫하면 예보 정보가 없는 다음 날의 새벽 정보를 받아오려 한다거나 등의 오류를 발생하기도 한다. 경험상 00시부터 02시 59분까지의 시간을 처리해줘야 했다.
가이드 중 예보 시간 설명. 동네예보는 예보 발표 시간으로부터 4시간 후의 날씨를 알려준다.
url_endpoint = Private.url_endpoint url_baseDate = 'base_date=' + now_date + '&' url_baseTime = 'base_time=' + base_time + '&' url_location = 'nx=' + '62' + '&' + 'ny=' + '122' + '&' url_numOfRows = 'numOfRows=10' + '&' url_pageNo = 'pageNo=1' + '&' url_dataType = '_type=json' url = url_endpoint + url_baseDate + url_baseTime + url_location + url_numOfRows + url_pageNo + url_dataType
REST_API에 사용될 url을 만드는 과정이다. Private 파일에 들어 있는 endpoint에는 API token을 포함해야 한다. 위치 설정도 여기서 하는데 nx와 ny의 설정을 통해 이루어 지며, 이 데이터는 가이드 압축파일의 엑셀파일에 정리되어 있다. 나머지 자세한 양식은 가이드에 명시되어 있다.
#GRIB처리 찾아볼 것 elif(str(i["category"]) == "R06" and isitRain == True): completed_message += "강수량은 " + str(i["fcstValue"]) + "mm입니다. \n" elif(str(i["category"]) == "S06" and isitSnow == True): completed_message += "적설량은 " + str(i["fcstValue"]) + "cm입니다. \n"
이 부분은 긴가민가했지만 일단 이렇게 처리했다. GRIB 데이터를 처리해야 하는 건지 아니면 그대로 단위만 붙여 사용하면 되는 건지 정확히는 모르지만, 일단은 단위만 붙여 사용하기로 했다. 이에 대해 정확히 아시는 분이 계신다면 댓글로 설명을 달아주시면 감사하겠다.
가이드에 명시된 표. JSON으로 오는 결과값이 문자열표시인지, GRIB 저장값인지 헷갈린다. windDirArray = ["북", "북북동", "북동", "동북동", "동", "동남동", "남동", "남남동", "남", "남남서", "남서", "서남서", "서", "서북서", "북서", "북북서", "북"] #-중략- elif(str(i["category"]) == "VEC"): windDir = (i["fcstValue"] + 22.5 * 0.5) / 22.5 completed_message += "풍향은 "+ windDirArray[int(windDir)] + "풍 입니다. \n" elif(str(i["category"]) == "WSD"): completed_message += "풍속은 " + str(i["fcstValue"]) + "m/s입니다.\n"
다음은 가이드에 명시된 계산법에 의한 풍향과 풍속 계산이다. 가이드에 따르면 UUU와 VVV가 각각 동서바람성분, 남북바람성분에 해단하는데 이를 이용하여 계산한 풍속보단 WSD라고 아예 명시된 풍속 데이터가 있기 때문에 이를 이용하기로 하였다.
가이드에 명시된 계산법. windDirArray는 16방위를 한글로 바꾼 것이다.
결과물. 뿌듯하다. 위 코드대로 완성된 챗봇이다. 공공데이터포털 뿐만 아니라 다양한 REST_API 형식의 API들은 Python이 아니더라도 이런식으로 사용할 수 있다. 여러분들도 다양한 데이터들을 활용하여 재밌는 시도를 해보길 바란다.
'삽질기 > 라즈베리파이' 카테고리의 다른 글
라즈베리파이로 NUGU 스피커 프로젝트 해 본 이야기 #2 (0) 2020.03.22 라즈베리파이로 NUGU 스피커 프로젝트 해 본 이야기 #1 (0) 2020.03.15 라즈베리파이와 챗봇으로 날씨 예보를 해보자 #2 (0) 2020.02.01 라즈베리파이와 챗봇으로 날씨 예보를 해보자 #1 (1) 2019.09.17 라즈베리파이를 다시 세팅해보자 #2 (0) 2019.08.24