Python
GoogleHome
スマートスピーカー

「え!?朝は雨降ってなかったのに!傘持ってきてないよ〜。」を解決するGoogleHome連携アプリを作ってみた

はじめに

GoogleHomeを使って、帰宅時刻の天気が悪天候であれば毎朝自動で傘を忘れないように音声通知してくれるちょっとしたアプリを作りました。
IFTTTとか使えばLINEやメール、PUSH通知は簡単にできるんだけど、やっぱり音声で教えてくれた方が忘れないし便利だと思うんです。
これで、濡れて帰ることも、突発的にビニール傘で出費することも、雨が止むまで無駄な残業をする必要もなくなります。

サーバーサイドのプログラムはPython、GoogleHome連携はNode.jsのgoogle-home-notifierで開発しました。
GitHubのリポジトリはこちらです。デプロイ方法とかも載せています。

完成物の動画

完成物の動画をYouTubeに投稿しました。

どうやってGoogleHomeを自発的に喋らせるか

ここらへんの記事を参考に、Node.jsのgoogle-home-notifierというライブラリを使用しました。

アルゴリズム概要

  1. cronでOpenWeatherMapのREST-APIを利用して指定都市の天気情報取得
  2. あらかじめ設定した帰宅時間帯の天気が悪天候(雨、雪、雷のいずれか)であればGoogle Homeに音声通知リクエスト
  3. Google Homeが音声通知

2018-05-05 14 00 53

たった、これだけです。
今回はServerはラズパイを使用しました。

ソースコード

天気予報情報をOpenWeatherMapのREST-APIを利用して取得して、それをもとにNodeJSファイルを実行するかを判断するメインのプログラムです。

weather.py
import configparser
import datetime
import requests
import os
import logging.config

# コンフィグファイル読み込み
inifile = configparser.ConfigParser()
inifile.read("config.ini")

# ログコンフィグファイル読み込み
logging.config.fileConfig("logging.conf")
logger = logging.getLogger("root")

# 本日の日付を取得
today = str(datetime.date.today())

# 帰宅時間を取得
back_time = inifile.get("back_time", "back_time")

# 天気情報取得パラメータ設定
city_id = inifile.get("openweathermap", "city_id")
app_id = inifile.get("openweathermap", "app_id")
params = {"id": city_id, "APPID": app_id}
headers = {"content-type": "application/json"}

# 天気情報を取得
response = requests.get("http://api.openweathermap.org/data/2.5/forecast", params=params, headers=headers)
data = response.json()

# 本日の帰宅時間の天気情報を抽出
weather_today_back_time = ""
for date_time in data["list"]:
    if date_time["dt_txt"].startswith(today) and date_time["dt_txt"].endswith(back_time):
        weather_today_back_time = date_time["weather"][0]["main"]
        logging.info("The weather of going home time: " + weather_today_back_time)

# もし悪天候であればGoogleHomeを喋らせるNodeJSを実行
if weather_today_back_time == "Rain" or weather_today_back_time == "Snow" or weather_today_back_time == "Thunderstorm":
    js_file = inifile.get("googlehomenotifier", "js_file")
    command = "/usr/local/bin/node " + js_file
    os.system(command)

GoogleHomeに音声通知リクエストを実施するプログラムはこちらです。
この記事のものをほぼそのまま流用しました。

main.js
const googlehome = require('google-home-notifier')
const language = 'ja';

googlehome.device('Google-Home', language);
googlehome.ip("192.168.11.3");
googlehome.notify('今日の帰宅時間頃は天気が崩れそうです。傘を忘れずに。', function(res) {
  console.log(res);
});

今後

GUIで設定できるようにしたり、電車の遅延を音声通知してくれたりも作ってみたい。