【Raspberry Pi 4】天気予報アラームはどのように作られるのか【Python】

【Raspberry Pi 4】天気予報アラームはどのように作られるのか【Python】

# はじめに

この記事はRaspberry Pi4(以下、ラズパイと表記)に天気予報を毎朝自動でおしゃべりさせることを目標にします。 iPhoneのアラームを卒業し、天気予報アラームを自動で流させることで毎朝のQOLを上げちゃおうという企画です。

# 概要

ラズパイに天気予報をしゃべらせるには、大きく分けて以下の2つの設定を行えばOK。 また、この記事では「しゃべらせる」という表現をたびたび行っていますが、これは天気予報のスクリプトを生成し、音声合成させ、それを再生することを指しています。

完成後はこんな感じで音声がでます。


# 気象予報を取ってくる

まずは天気予報の情報を取得する必要があります。

そのためにAPIを使用しますが、有名なAPIにlivedoor社が提供する天気予報Webサービス「Weather Hacks」があります。しかし、2020年7月31日をもってこのサービスは終了しました😇

ですので、OpenWeatherMapという無料で使用できるAPIを用いて気象情報を取得します。
👉OpenWeatherMap: Сurrent weather and forecast

このAPIで取得してきた気象予報データをPythonでスクリプトを作成し、音声合成を行います。 音声合成はAquesTalkPiというサービスを使用し、スピーカーから音声を流します。

僕の環境はラズパイをスピーカーに繋がず、音声はmacにペアリングしているBluetoothスピーカーから出力する設定です。ラズパイからmacへの音声転送については別に記事にしていますので、そちらも参考にしてください。


# 毎朝しゃべらせたい

アラームを設定するためには、決まった時間に音声ファイルをキックする必要があります。 作成したpythonコードをラズパイのcronを利用して定期実行させます。


# 作り方

この章では実際にどのような手順で天気予報アラームを作ったのかを記載します。

# 環境

まずは開発環境です。

# mac

macOS Catalina version 10.15.6

# ラズパイ

Raspberry pi4を使用しています。

No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 10 (buster)
Release:	10
Codename:	buster

Linux raspberrypi 5.4.51-v7l+ #1327 SMP Thu Jul 23 11:04:39 BST 2020 armv7l GNU/Linux

また、pythonのバージョンは、3.7.6です。

# 構成

システム構成は以下になります。


✅OpenWeatherMap
 👇APIでJSONを取得
✅ラズパイ 
 👇定期的にpythonで音声合成(cron)
 👇音声をAquesTalkPiで読み上げ
 👇PulseAudioでmacへ転送
✅mac
 👇
✅Bluetoothスピーカー
 👇
✅Good morning


# 天気情報の取得

天気情報の取得はラズパイにPythonのスクリプトに実行させます。 用意したスクリプトは以下です。

OpenWeatherMapから取得されるJSONは。以下のスクリプトで使っている以外にもたくさんの情報をもっているので、必要なものを取得してください。 APIを利用するためには無料登録が必要なので、以下のサイトにならって登録しました。
👉OpenWeatherMapで天気予報を取得。 | ハックノート

このスクリプトは、天気情報を取得した後、必要情報を音声合成用に文字列に変換、それをAquesTalkPiに渡してあげるようにしています。
AquesTalkPiについては、wgetでインストールできなかったので、本家のサイトから直接ダウンロードしました。
👉AquesTalk Pi - Raspberry Pi用の音声合成アプリ

ダウンロード後は任意のディレクトに解凍しましょう。

こちらがソースコードです。
音声合成用のセリフは棒読みちゃんリスペクトです😌

# -*- coding: utf-8 -*-

import json
import requests
import datetime
import sys, os

def getWeather():

        city = "Tokyo"
        key = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX'  #your API Key
        url = 'http://api.openweathermap.org/data/2.5/forecast?units=metric&lang=ja&cnt=2&q=' + city + '&APPID=' + key

        print(url)
        response = requests.get(url)
        data = response.json()
        jsonText = json.dumps(data, indent=4)
        data = json.loads(response.text)
        print("done json load")
        return data

if __name__ == "__main__":
        data = getWeather()
        weather =  "ゆっくりが今日の天気をお知らせするよ。"

        #今日の日付
        dt = datetime.datetime.now()
        weather += "今日は" + str(dt.year) + "年" + str(dt.month) + "月" + str(dt.day) + "日だよ。"
  
        # お天気データを整形
        try:
                weather += data["city"]["name"] + "の正午の天気は、"
                weather += data["list"][0]["weather"][0]['description'] + "だよ。"
                weather += "最高気温は、" + str(data["list"][0]["main"]["temp_max"]) +"度。"
                weather += "最低気温は、" + str(data["list"][0]["main"]["temp_min"]) +"度だよ。"
                weather += "15時の天気は" + data["list"][1]["weather"][0]['description'] + "だよ。"
        except TypeError:
                print("Error")
                pass
        
        weather += "終わりだよ。"
        print(weather)
        #読み上げ
        cmd = "/home/pi/aquestalkpi/AquesTalkPi " + weather + " -s 90 | aplay"
        os.popen(cmd).readline().strip()


pythonコードを実行するとご機嫌な天気予報をラズパイが喋り出します。

# 定期実行させる

あとは作成したPythonコードをcronに登録して定期実行させればアラームの完成です。
cronは、Linuxがもつ定期処理実行を行うプログラムです。
crontabに追記したプログラムを定期実行しくれます。
👉cron の使い方(pythonスクリプト) - Qiita

コマンドラインからcrontab -eで起動した画面に以下を追記します。
以下の例は毎日8時30分に定期実行させる設定にしました。
ここでの注意点は、pythonとスクリプトの両方をフルパスで記述する必要があります。

# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command

30 8 * * * /usr/bin/python work/weatherAlerm.py

以上で設定は完了です。

これで明日も気持ちよく目覚められそうですね。

デジタル分野やビジネス関連で学んだことを記事にしています。
Read moreやTagから他記事を検索できますので合わせてどうぞ😊

Philipp
Read more