openweathermapでpythonの天気予報読上げプログラムを再リプレース

2022年7月19日

さて、前回の記事では、openweathermap から天気情報を抽出しました。

ここでは、都市名(東京)を指定して天気の情報を抽出したのですが、openweathermap では、緯度、経度を指定することで、ピンポイントで天気の情報を獲得できるようです。

それならば、livedoor や yahoo!天気ではできなかった我が町である横須賀の天気情報を得ることも可能です。

現在、休止を余儀なくされている「お天気読み上げ」、「電光掲示板表示」、「LineNotify への情報送付」も、横須賀の天気を表示することで再開できるはずです。

そこで、休止している三つの処理のうち、まずは、一番簡単な「お天気読み上げ」を蘇らせることにしました。

スポンサーリンク

過去プログラムを利用してリプレース実施

下記記事にあるように、当初の「お天気読み上げ」は livedoor のサービスを利用していました。

この livedoor のお天気情報サービスは、今回使用する openweathermap のサービスと同様に jsonデータを返してくれるものでした。

そのため、データ読み込み部分は、 URL を変更するだけで当時のプログラムをそのまま利用できます。

そして、読み込んだデータの天気、最高気温、最低気温を取り込む部分を変更すればプログラムのリプレースが完了します。

参考記事を基に、天気、最高気温、最低気温が、読み込んだデータのどこに入っているか見ていきましょう。

参考記事では、風力、降水確率、湿度なども読み上げさせていますが、まずはシンプルに、天気、最高気温、最低気温のみを読み上げることにします。

 "daily": [
{
"dt": 1650160800,
"sunrise": 1650139586,
"sunset": 1650186898,
"moonrise": 1650189000,
"moonset": 1650140520,
"moon_phase": 0.5,
"temp": {
"day": 15.2,
"min": 11.1,
"max": 15.74,
"night": 13.71,
"eve": 12.65,
"morn": 11.3
},
"feels_like": {
"day": 14.16,
"night": 12.89,
"eve": 11.88,
"morn": 10.1
},
"pressure": 1019,
"humidity": 53,
"dew_point": 5.69,
"wind_speed": 4.89,
"wind_deg": 98,
"wind_gust": 5.56,
"weather": [
{
"id": 500,
"main": "Rain",
"description": "小雨",
"icon": "10d"
}
],
"clouds": 80,
"pop": 0.52,
"rain": 0.83,
"uvi": 3.89
},

今日の天気

今日の天気は、#today で設定しています。

天気は、d[0][“weather"][0][“description"] に入っています。

当初のプログラムでは、今日の最高気温と最低気温は読み上げの対象となっていませんでした。

ですが、round(Nt[“max"], 1)、 round(Nt[“min"],1) で取り込めるようです(そのため、まずは、Nt = d[0][“temp"] の一文が必要です)。

そのため、最高気温と最低気温は読み上げの対象として追加します。

明日の天気

明日の天気は、#tommorow で設定しています。

天気は、d[1][“weather"][0][“description"] に入っています。

最高気温と最低気温は、round(Nt[“max"], 1)、round(Nt[“min"],1) で取り込めるようです。

今日の天気と同様に、始めに Nt = d[1][“temp"] の一文が必要です。

その他

当初は、読み上げの最初に title(たしか、「M月D日の天気です」みたいなこと)を読み上げていましたが、今回の読み上げプログラムからは除外します。


修正後ソースプログラム

こちらが、修正後のプログラムです。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import shlex
import subprocess
from datetime import datetime
import urllib.request
import json
CMD_SAY = 'jsay'
def main():
say_datetime()
say_weather()
return
def say_datetime():
d = datetime.now()
text = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second)
text = CMD_SAY + ' ' + text
print (text)
text = '/usr/local/bin/' + text
print (text)
proc = subprocess.Popen(shlex.split(text))
proc.communicate()
return
def say_weather():
# 横須賀 北緯(lat)35度30分、東経(lon)139度45分
json_url = 'https://api.openweathermap.org/data/2.5/onecall?lat=35.3&lon=139.45&appid={あなたのappid}&units=metric&lang=ja&exclude=hourly' #API URL
print (json_url)
weather_text = u'%sの天気は%sです。'
temperature_text = u'%sの予想最高気温、%s度、予想最低気温、%s度です。'
try:
r = urllib.request.urlopen(url=json_url)
obj = json.loads( r.read().decode('utf-8') )
# title = obj['title']
# print (title)
d = obj["daily"]
# TODAY
Nt = d[0]["temp"]
today_w = d[0]["weather"][0]["description"]
today_w_txt = weather_text % (u"今日", today_w)
today_t_txt = temperature_text % (u"今日", round(Nt["max"]), round(Nt["min"]))
# TOMMOROW
Nt = d[1]["temp"]
tommorow_w = d[1]["weather"][0]["description"]
tommorow_w_txt = weather_text % (u"明日", tommorow_w)
tommorow_t_txt = temperature_text % (u"明日", round(Nt["max"]), round(Nt["min"]))
# SAY
# weather_str = title + ' ' + today_w_txt + ' ' + tommorow_w_txt + ' ' + tommorow_t_txt
weather_str = today_w_txt + ' ' + today_t_txt + ' ' + tommorow_w_txt + ' ' + tommorow_t_txt
#weather_str = weather_str.encode('utf-8')
text = '''%s '%s' ''' % (CMD_SAY, weather_str)
print (text)
proc = subprocess.Popen(shlex.split(text))
proc.communicate()
finally:
r.close()
return
### Execute
if __name__ == "__main__":
main()

実行すると、次のような音声が流れます。

日付の読み上げは2~4後に話してくれますが、天気予報の読み上げはちょっと遅く12秒に始まりますので、ちょぴり待つか、ぶっ飛ばして聞いていただければと思います。

決まった時間に喋らせる

最後に、crontabを使用して決まった時間にお天気予報を喋ってもらうようにしました。以前は、日に5回喋らせていましたが、8時と15時の2回のみにします。

0 8,15 * * * python3 /home/pi/python_pg/open_jtalk/open

それにしても、livedoor サービス終了、Yahoo!天気 サービス終了とサービス停止が続いて、その度毎にリプレースを行い、少々くたびれました。

次は、openweathermap で「LineNotify への情報送付」のリプレースを実施する予定です。

スポンサーリンク

最後に

openweathermapを使って、pythonの天気予報読上げプログラムを再リプレースするチャレンジを行いました。

openweathermapでは、livedoorのプログラムと同じ読み込みで対応できるとわかったので、URL変更だけで対応できたのは良かったです。

後は、緯度、経度を使用することで、我が街「横須賀」の天気予報を出せたのも進化ですね。

プラス最高気温、最低気温も追加できてよかったです。

■思えば、「openjtalk」の記事も増えてきました

参考記事
Raspberry Piに現在時刻、天気予報を喋らせる

スポンサーリンク
この記事を書いた人

60爺

60路を越え、RaspberryPi と出会い、その関係でブログ開設(2017/2~)となりました。始めてみると、コツコツやるのが性に合ってしまい、漢字の記事から家の補修・将棋・windows10関係・別名・言い方などジャンルを拡大して今に至ってます。まだまだ、元気なので新たな話題を見つけて皆様に提供できればと思っています。「プロフィールはこちら

openjtalk

Posted by 60爺