【Pepper】 날씨 API와의 제휴

10628 단어 Pepper
야마로보 기술 담당 Hata입니다.

Pepper에게 "오늘의 날씨는?"
거기서, 이번은 OpenWeatherMap 라고 하는 무료의 날씨 API와 제휴해, Pepper가 날씨 정보를 가르쳐 주는 것 같은 프로젝트를 자작했으므로 소개합니다.

API 응답은 JSON 형식입니다. 아래 기사를 참고하십시오.
JSON - 날씨 정보 얻기

날씨 획득 상자 만들기


  • 비헤이비어를 마우스 오른쪽 버튼으로 클릭 > 새 상자 만들기 > Python으로 새 상자를 만듭니다
  • 스크립트 편집기에서 다음 코드 작성
  • [출력 추가]에서 출력에 "result"를 추가
  • Speech Reco 상자를 만들고 Word list에 "오늘의 날씨는; 오늘의 온도는; 내일의 날씨는; 내일의 온도는"을 추가
  • Set language > Speech Reco(4.) > Weather(1.~3.) > Say Text 순으로 연결



  • Weather 상자 스크립트
    class MyClass(GeneratedClass):
        def __init__(self):
            GeneratedClass.__init__(self, False)
    
        def onLoad(self):
            pass
    
        def onUnload(self):
            pass
    
        def onInput_onStart(self, p):
            # self.logger.info(p)
    
            import requests
            import json
    
            r = requests.get('http://api.openweathermap.org/data/2.5/forecast?q="Tokyo","Japan"')
    
            list = r.json()['list']
            today = list[2]
            tommorow = list[10]
    
            result = {\
                "今日の天気は":getWeather(today),\
                "今日の温度は":getTempa(today),\
                "明日の天気は":getWeather(tommorow),\
                "明日の温度は":getTempa(tommorow)\
            }
    
            self.result(result[p])
    
            pass
    
        def onInput_onStop(self):
            self.onUnload() #it is recommended to reuse the clean-up as the box is stopped
            self.onStopped() #activate the output of the box
    
    def getWeather(obj):
        weather = obj['weather'][0]['main'].replace('"', '')
        if (weather == 'Clear'):
            return '晴れです'
        elif (weather == 'Clouds'):
            return '曇りです'
        elif (weather == 'Rain'):
            return '雨です'
        else:
            return 'わかりません'
    
    def getTempa(obj):
        temp = int(float(json.dumps(obj['main']['temp']).replace('"','')) - 273.15)
        return str(temp) + '度です'
    

    코드 해설



    순서대로 설명합니다.

    먼저 onInput_onStart 메서드의 인수에 p를 추가합니다.
    이것은 이전의 박스로부터의 출력치를 받습니다.

    Weather
    def onInput_onStart(self, p):
    

    그런 다음 API에 액세스하여 검색합니다.
    이 때 미리 필요한 모듈을 가져옵니다.

    API 정보
    今回アクセスするAPIで取得できる天気情報は、
    0時・3時・6時…と、3時間おきに定時刻に配信されます。
    
    APIを叩いた時刻に最も近い天気情報は、list[2]で取得できます。
    
    1日あたりの配信数は8通となりますので(24時間÷3時間 = 8通)
    翌日の同配信時刻は、リスト番号に+8した
    list[10]で取得できます。
    

    Weather
    import requests # HTTPリクエストするのに必要
    import json # JSON操作するのに必要
    
    # 東京の天気を取得
    # forecastで"Call 5 day / 3 hour forecast data"(5日分の3時間毎の情報)を取得
    r = requests.get('http://api.openweathermap.org/data/2.5/forecast?q="Tokyo","Japan"')
    
    # listにforecastの情報が配列として入っているので取得
    list = r.json()['list']
    # 今日の情報を取得
    today = list[2]
    # 明日の情報を取得
    tommorow = list[10]
    

    나중에 출력에 결과를 반환합니다.

    Weather
    # Speech Recoの結果によって返す値を切り替える
    result = {\
        "今日の天気は":getWeather(today),\
        "今日の温度は":getTempa(today),\
        "明日の天気は":getWeather(tommorow),\
        "明日の温度は":getTempa(tommorow)\
    }
    
    # 出力変数resultに値をセット
    self.result(result[p])
    

    결론



    API에 따라 JSON의 구조가 다르기 때문에,
    사용하고 싶은 API에 맞게 변경하십시오.

    이번 코드는 여기

    좋은 웹페이지 즐겨찾기