33
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Pepper】お天気APIとの連携

Last updated at Posted at 2015-09-26

ヤマロボ 技術担当のHataです。

Pepperに「今日の天気は?」と聴いてもデフォルトでは教えてくれません。
そこで、今回はOpenWeatherMapという無料のお天気APIと連携して、Pepperがお天気情報を教えてくれるようなプロジェクトを自作したのでご紹介します。

APIのレスポンスはJSON形式です。以下の記事を参考にしてください。
JSON - 天気情報を取得する

お天気取得ボックスの作成

  1. ビヘイビア上で右クリック > [ボックスの新規作成] > [Python] で新規にボックスを作成
  2. スクリプトエディタで以下のコードを作成
  3. [出力を追加]で出力に「result」を追加
  4. Speech Recoボックスを作成し、Word listに「今日の天気は;今日の温度は;明日の天気は;明日の温度は」を追加
  5. Set language > Speech Reco(4.) > Weather(1.~3.) > Say Textの順で繋ぐ

WeatherPepper.PNG

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に合わせて変えてください。

今回のコードはこちらから。

33
36
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?