Raspberry Piを使ってGoogle Homeに1時間後に雨が降る可能性を予測してもらいましょう
“Raspberry Piを使ってGoogle Homeに時報サービスをしてもらいましょう”の続きです。
“Google Home“に「OK Google, 今日の天気は?」って訊ねれば、天気予報を教えてくれるんですが、外出前の習慣にはなかなか出来ず、折角の機能が勿体無いなあ、と思っているところです。
それなら、以前のTALKでお話した通り、”Google Home”で時報を知らせてくれるようにしたので、その時に利用した”google-home-notifier“を使って、外出前の天気予報を勝手に喋ってくれる仕掛けを作ってみることにしました。ただ、普通の天気予報の内容だとザックリし過ぎなので、出掛けに雨が降る可能性を教えてくれるようにしてみました。
(1) 1時間後の時間雨量のデータを取得してみましょう
一般的な天気予報の内容でも良いのですが、外出前に一番知りたいのが雨が降る確率ですよねえ。
“Yahoo! デベロッパーネットワーク“のうち、今回は、”Web API“として提供している”YOLP(地図):気象情報API“を活用すると、現在ならびに1時間後の時間雨量データを取得することができます。
このAPIで取得できるデータは、降水強度です(単位:mm/h)。説明によると、「降水強度は、気象レーダーで観測された降水の強さを時間雨量(mm/h)に換算した値で、実際の雨量とは異なります。」ということなんですが、ま、細かいことはともかく、時間雨量の値を参照すれば、雨が降るかどうか判断できそうなので、このWeb APIを利用してみることにします。
なお、APIの利用に先立ち、APIを利用する”アプリケーションを登録“して、APIでリクエストを発行する際に必須項目となるアプリケーションIDを用意しておく必要があります。
APIを利用して、リクエストを発行して、その結果にもとづき、Google Homeに喋ってもらう文章をテキストファイルに書き込むところまでの”Python“スクリプトを書いてみます。
nano /home/pi/weather_google_home_notifier.py
#!/usr/bin/env python
# coding: utf-8
import requests
import urllib
import pprint
import json
import struct
import subprocess
def main():
url = makeUrl()
json_data = requestJson(url)
current_rainfall = currentRainfall(json_data)
one_hour_rainfall = oneHourRainfall(json_data)
if speakGoogleHomeIfNeeded(current_rainfall, one_hour_rainfall):
message = ("1時間後の雨の量は、%s mmです" % (one_hour_rainfall))
speak_google_home(message)
else:
message = ("1時間後に雨は降らない模様です")
speak_google_home(message)
def makeUrl():
APP_ID = "アプリケーションID"
BASE_URL = "https://map.yahooapis.jp/weather/V1/place"
COORDINATES = "緯度、経度"
OUTPUT = "json"
yolp_url = BASE_URL + "?appid=%s&coordinates=%s&output=%s" % (APP_ID,COORDINATES,OUTPUT)
return yolp_url
def requestJson(url):
req = requests.get(url)
json_data = req.json()
return json_data
def wetherData(json_data):
return json_data['Feature'][0]['Property']['WeatherList']['Weather']
# 現在の時間雲量
def currentRainfall(json_data):
weather = wetherData(json_data)
return weather[0]['Rainfall']
# 1時間後の時間雲量
def oneHourRainfall(json_data):
weather = wetherData(json_data)
return weather[1]['Rainfall']
# 1時間後の時間雲量が現在の量よりも多いかどうか確認する
def speakGoogleHomeIfNeeded(current_rainfall, one_hour_rainfall):
if one_hour_rainfall > 0:
return True
return False
# Google Homeに喋ってもらう文章をテキストファイルに書き込む
def speak_google_home(message):
file = open('/home/pi/weather_google_home_notifier.txt', 'w')
file.writelines(message)
file.close()
if __name__ == '__main__':
main()
続いて、テキストファイルの中身をGoogle Homeで読み上げるスクリプトを書いてみます。
こちらのスクリプトは、”google-home-notifier“をインストールしておくことが前提になります。詳しい説明は、以前のTALK “Raspberry Piを使ってGoogle Homeに時報サービスをしてもらいましょう”をご覧ください。
で、こちらは、”google-home-notifier“と相性の良いJava Scriptで書いてます。ちなみに、”google-home-notifier“では専用サーバーを立てることもできるので、別のラズパイから”Python“でリクエストすることも可能なのですが、POOHの環境ではうまく実行できなかったので、今回は”Java Script“を用いて、ローカルで”google-home-notifier“を呼び出しています。
nano /home/pi/googlehome-weather_report.js
var googlehome = require('google-home-notifier');
var language = 'ja'; // if not set 'us' language will be used
googlehome.device('Google Homeの名前', language); // Change to your Google Home name
// or if you know your Google Home IP
//googlehome.ip('192.168.1.2', language);
var fs = require('fs');
fs.readFile("/home/pi/weather_google_home_notifier.txt", 'utf8', function (err, data) {
if (err) {
throw err;
}
googlehome.notify(data, function(res) {
console.log(res);
});
});
(2) 書いたスクリプトを定期的に実行するクーロンを設定しましょう
cronを使って、上記で用意したスクリプト 2本を定期的に実行するようにしておきましょう。なお、一日中、喋られても何なので、POOHの場合は、午前7時から9時までの間、毎時1回、喋ってくれるようにしました。
crontab -e
01 7-9 * * * python /home/pi/weather_google_home_notifier.py
02 7-9 * * * node googlehome-weather_report.js
sudo /etc/init.d/cron start
|
|
|
“Adobe Stock“でベストショットな写真素材を販売中です。是非ご覧下さい。
ホームページ “THE POOH FILES” にも是非お立ち寄り下さい。