もみあげあしめ

組み込みとかIoTとか、いろいろ

お天気お知らせシステムを作る

傘忘れた。

f:id:shima_nigoro:20160710191237p:plain:w300

そんな悲劇を繰り返さないため、明日のお天気を知らせるシステムを作ろうと決意したのである。

システム概要

  1. お天気情報を取得して、整形する
  2. 整形データ(お天気情報文字列)を音声に変換して、スピーカから出力する

システム構成

ハードウェア

ソフトウェア

お天気情報を取得して、整形する

Weather Hacks - livedoor 天気情報 からお天気情報を取得します。

地域別のID番号を取得する

1次細分区定義表 - livedoor 天気情報 から住んでいる地域を探してIDを特定します。
例えば、東京は「130010」、大阪は「270000」、名古屋は「230010」、福岡は「400010」。

JSON形式のデータを取得して、整形する

とりあえず、東京のお天気情報を取得して、標準出力に吐き出すスクリプトを作った。
・下記を get_weather.py として保存

#!/usr/bin/python
# -*- coding: utf-8 -*-
import urllib
import sys
import json

WEB_SERVICE_URL = "http://weather.livedoor.com/forecast/webservice/json/v1?city="
CITY_ID = 260010

SAVE_PATH = "/home/pi/tmp/"
SAVE_FILE_NAME = "weather.json"

#今日、明日、明後日を設定
SEARCH_DATA_LABEL = '明日'

def download():
  open_url = WEB_SERVICE_URL + str(CITY_ID)
  save_title = SAVE_PATH + SAVE_FILE_NAME
  urllib.urlretrieve(open_url,save_title)

def get_weather(data_label):
  with open(SAVE_PATH + SAVE_FILE_NAME, 'r') as f:
    JSONData = json.load(f)
    forecasts_list = JSONData['forecasts']
    for i in range(len(forecasts_list)):
      if forecasts_list[i]['dateLabel'].encode('utf-8') == data_label:
        weather = forecasts_list[i]['telop']
        break
    return weather.encode('utf-8');

if __name__ == "__main__":
  download()
  print SEARCH_DATA_LABEL + 'の天気は' + get_weather(SEARCH_DATA_LABEL) + 'です'

スクリプト内のパラメータのうち変更して使えるのは下記とおり。

パラメータ 設定できる値
CITY_ID 地域別のID番号
SAVE_PATH JSONデータを保存するパス
SAVE_FILE_NAME JSONデータのファイル名
SEARCH_DATA_LABEL いつの天気を取得するか。今日、明日、明後日で設定

整形データを音声に変換して、スピーカから出力する

【ネタ】自動おかえりシステムを作る - もみあげあしめ で使ったスクリプトを再利用する

Open JTalk のインストール

・入っていなければ実施

sudo apt-get install open-jtalk open-jtalk-mecab-naist-jdic

音声再生用スクリプト

・下記を jtalk.sh として保存

#!/bin/bash
HV=/usr/share/hts-voice/mei/mei_happy.htsvoice

tempfile=`tempfile`
option="-m $HV \
  -s 19200 \
  -p 100 \
  -a 0.03 \
  -b 0.5 \
  -fm 0.6 \
  -r 0.8 \
  -u 0.0 \
  -jm 1.0 \
  -jf 1.0 \
  -x /var/lib/mecab/dic/open-jtalk/naist-jdic \
  -ow $tempfile"

if [ -z "$1" ] ; then
  open_jtalk $option
else
  if [ -f "$1" ] ; then
    open_jtalk $option $1
  else
    echo "$1" | open_jtalk $option
  fi
fi

aplay -q $tempfile
rm $tempfile

※ mei_happy.htsvoice はこちらのものを利用させていただいています。

・先ほど作成したお天気取得用のスクリプト get_weather.py と連携させる

 python get_weather.py | sh jtalk.sh

これでお天気を音声で出力できます。

寝る前に通知してもらう

・cronを編集する

crontab -e

・23時40分と50分くらいに音声でお知らせしてもらう

40,50 23 * * * python /home/pi/get_weater.py | sh /home/pi/jtalk.sh

※cron使うときは絶対パスを使うほうがいいっぽい。

おわりに

オートパワーオン・オフ機能がついているスピーカーは、Raspberry Piと相性が良い。

JVC SP-A230-W ポータブルスピーカー ホワイト

JVC SP-A230-W ポータブルスピーカー ホワイト