平日って、毎朝同じ時間帯に同じことをしていますよね。食事したり服を着替えたり。
そんな時、ラズパイが今日の天気を教えてくれたら便利じゃないですか?
スポンサーリンク
きっかけ
忙しい朝に限って「今日天気悪くなりそうだな…さっきテレビで天気予報やってたけど見逃した…」って時ありますよね。
私の場合、毎朝同じ時間帯に着替えをしています。忙しい朝の時間帯、着替えながら天気予報がわかると非常に助かります。
ラズパイが喋ってくれたら嬉しいなーということで実装しました。
実装方法
今回は、RaspberryPi 2を使用しました。
基本的な実装方法は他サイトを参考にしました。
基本的な仕組みとしては、livedoor天気予報が提供しているWether HacksのAPIを叩いて読み上げているだけです。
(商用利用は不可となっていますので、個人利用に留めてください)
天気予報がJSONで提供されているので、パースするだけです。
JSONデータを取得してパースするまでは、PHPで実装します。
パースした結果を喋らせるのには、OpenJTalkを利用します。
本実装では、PHPの実行環境が必要になるため、事前にインストールしておいて下さい。(aptで簡単にインストールできます)
いざ実装
以下のソースは、参考にしたサイトのものを多少修正しています。
(修正点は後ほど記載します)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | <?php $txt = morning_call(); echo $txt; exec('/usr/local/bin/jsay '.$txt); $txt = weather(); if(strlen($txt) >= 980){ $txt= mb_strcut($txt,0,980); $txt = substr($txt, 0, strrpos($txt, "。")); } $txt = "お待たせしました。".$txt; echo $txt; exec('/usr/local/bin/jsay '.$txt); $txt = "以上、天気予報をお伝えしました。"; exec('/usr/local/bin/jsay '.$txt); function morning_call(){ $weekday = array('日','月','火','水','木','金','土'); $date = date('n月j日'); $dow = $weekday[ date('w') ].'曜日'; $time = date('G時i分'); $txt = 'おはようございます。'.$date.'、'.$dow.'、'.$time.'です。天気を調べるので、すこしだけお待ちください。'; return $txt; } function weather(){ $id = '090010'; $url = 'http://weather.livedoor.com/forecast/webservice/json/v1?city='.$id; $json = @file_get_contents($url); $obj = json_decode($json); $txt = ''; if($obj==null){ $str .= "天気情報がありません。"; }else{ if(isset($obj->forecasts[0]->dateLabel)){ $txt .= $obj->forecasts[0]->dateLabel.'の'; } if(isset($obj->title)){ $txt .= $obj->title.'は、'; } if(isset($obj->forecasts[0]->telop)){ $txt .= $obj->forecasts[0]->telop.'です。'; } if(isset($obj->description->text)){ $txt .= $obj->description->text; } } $txt = preg_replace('/(\s| )/','',$txt); $txt = preg_replace('/\n|\r|\r\n/', '', $txt); $txt = preg_replace('/<天気変化等の留意点>/','続いて、天気変化等の留意点をお伝えします。',$txt); return $txt; } function temp(){ $id = '090010'; $url = 'http://weather.livedoor.com/forecast/webservice/json/v1?city='.$id; $json = @file_get_contents($url); $obj = json_decode($json); $txt = ''; $flag = False; if($obj==null){ $str .= "天気情報がありません。"; }else{ if(isset($obj->forecasts[0]->dateLabel)){ $txt .= $obj->forecasts[0]->dateLabel.'の'; } if(isset($obj->forecasts[0]->temperature->max->celsius)){ $txt .= '最高気温は'.$obj->forecasts[0]->temperature->max->celsius.'どです。'; $flag = True; } if(isset($obj->forecasts[0]->temperature->min->celsius)){ $txt .= '最低気温は'.$obj->forecasts[0]->temperature->min->celsius.'どです。'; $flag = True; } if ($flag == False) { $txt = '宇都宮市の天気をお知らせします。天気を調べるので、すこしだけお待ちください。'; } } $txt = preg_replace('/(\s| )/','',$txt); $txt = preg_replace('/\n|\r|\r\n/', '', $txt); $txt = preg_replace('/</','',$txt); $txt = preg_replace('/>/','',$txt); return $txt; } |
ソースの修正点は、以下の通りです。
- 突然、天気予報を喋るのではなく、前振りを喋らせるようにした。
- <天気変化等の留意点>タグの内容を喋らせるようにした。
(予報によっては、留意点がない場合もあるようです)
このソースを「weather.php」として保存します。
天気予報を聞いてみる
先ほど保存した「wether.php」を実行します。
$ php weather.php
これだけでOKです。
うまくいけば、しばらくラズパイが考えた後に喋り出すと思います。天気予報本文を喋るまでに1分弱かかるかもしれません。気長に待ちましょう。
成功したら、cronスケジューラに登録しておくことで、毎日決まった時刻に天気予報を喋らせることができます。
まとめ
毎朝決まった時刻に天気予報を教えてくれるのは助かります。
ですが、少し時間帯をずらして行動する場合は、対応できなくなります。
そのような時のために、次はラズパイにスイッチを付けて好きなタイミングで天気予報が聞けるようにしたいと思います!
※2017/05/10追記
ラズパイにスイッチを接続する記事を書きました!
[…] Pingback: RaspberryPiで天気予報を聞こう – デスマ購買部 […]