ヤマロボ 技術担当の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に合わせて変えてください。
今回のコードはこちらから。