raspberry piを使って家のIoT化
最近、会社の新規事業部に移りラズパイを使ったIoT案件を担当するようになりました。そんな時に「もやし工房」さんの子どもがいる家庭で使うRaspberryPi&Slack | もやし工房に触発されて自分でもやってみようと発起。
妻に提案したところ、IoT?なんじゃそりゃ状態。とりあえず生活する上で不便な点をヒヤリングして下記の与件を実装してみました。
音声認識(siri化)や家電との連動まで予定していますが、ちょっと時間かかりそうなのでミニマムスタートで実装できる機能に絞りました。
- 「今から帰ります通知」の自動化
- 今日は何ゴミの日通知の自動化
- 天気予報の自動通知
- 次のバス(最寄りのバス停)の時間を自動検索
システム構成
- OpenJtalksによる合成音声の生成と再生
- node.js(hubot)&slackによるコマンドの受付
- cron(node.js)によるコマンドの定期実行
- demon(node.js)によるhubotのデーモン化
- IFTTTによるトリガーの設定
システム構成はすごくシンプルです。
botの雛形であるhubot(node.js)をインストールしてslackに常駐させておき、slack経由でraspberrypiの発話用sh(OpenJTalks)をキックするだけです。
あとは、直接slackにコマンドを打ち込むか、IFTTTをトリガーにしてslackにコマンド付きのメッセージを自動送信するように設定しております。
「今から帰ります通知」の自動化
我が家では仕事が終わって帰宅する際 LINEで「今から帰りますー」とか連絡を入れる習慣があります。(世の中の旦那さんには結構共通である習慣じゃないでしょうか?)
今まで毎回手動で打っていたのが煩わしくなり、IFTTTを使って自動化しました。
IFTTTはプログラムいらずで簡単にwebサービス同士を連携できるサービスで、「〇〇したとき△△△する」見たいなレシピ(設定)を自分で作ることができます。
会員登録が必要ですが、無料で使えるのでかなり便利です。
今回は「iOS LocationもしくはAndroid Location」と「slack」を提供しているのでこの2つを組み合わせております。
iOS Locationで特定のエリアに入った際にslackの特定ユーザー(hubot)にメッセージ「say 父ちゃんが〇〇駅に到着しました。」を送りつける設定をします。
するとslack上に常駐しているhubotが「say」コマンドを受けて後ろのコメントを発話用のshに渡し実行してくれます。
実際に家では上記のコメントをraspberrypiが読み上げてます。
音声通知はだいたい家にいる嫁に対して有効です。
sayコマンドで入力すれば読み上げてくれるので、「土曜の12:00から歯医者予約した〜」など、ちょっとした連絡もチャットすれば読み上げてくれるので便利です。
アプリを開く手間もいらないので音声通知は受け手側にとって便利ですね。
普通にIFTTTだけでもGPS&LINEの組み合わせで自動連絡ができるので音声通知まで必要ないって方にもおすすめです。
「今日は何ゴミの日」通知
ゴミ捨ては毎朝の日課なのですが、私はいつも今日が何ゴミの日か忘れてしまいます。
燃えるゴミ、燃えないゴミなど大きな分類はいいのですが、電池、ビン、缶、ダンボール、衣類など細かい分類が何曜日に出すのか忘れてしまうので、毎朝特定の時間になったら通知してくれる機能を実装しました。
npmでnodejsのcronモジュールをインストールすればhubot上の関数も定期実行してくれるので相性がいい感じです。
実装編の解説は別でアップしようと考えてますが取り敢えずゴミの日の通知部分をgistにアップしました。
天気予報の自動通知
テレビ見ろって感じですが、API絡めた何かも作りたかったのでド定番を。
APIはWeather Hacksが提供しているものが無料で使用できたのでこちらを使いました。
まだ使って間もないのですが精度と情報量がいい感じです。
こちらもcronとOpneJTalksを組み合わせて喋らせてます。さすがにこの文章量はwavファイルの生成に時間がかかるので発話までに少しラグがあります。
あとOpenJTalksが[寒気:カンキ]をサムケと読んだりしてました。
気が向いらた修正できるか調べてみようと思います。
APIのコールはhubotが標準でhttpクラスを提供してくれているので引数にwebAPIのURLを渡せばjsonで返却してくれます。
返却されるコメントには改行や半角スペースが入っており、そのままOpenJTalksに渡すとうまく喋ってくれないので、正規表現で削除してから渡すようにしています。
次のバス(最寄りのバス停)の時間を自動検索
我が家は最寄駅から少し距離があるためバスに乗る機会が多いのですが、バスの時刻を調べるときはいつもスマホで撮ったバス停の時刻表との睨めっこが始まります。
単純な作業ですが毎回微妙なストレスが溜まるので自動算出できるようにコーディングしました。
次のバスまでの時間とバスの時刻とその次の時刻までを読み上げる仕様です。
「8分後」とか言ってくれるので、今から出たら間に合わないなとかの判断もできるので意外と便利です。
APIとかあればいいのですが探していない、バスの時刻表をハードコーディングしてます。汎用的な設計というよりかは我が家に最適化されていればいいという考えでやってるので。
また時刻の判定ロジックをシンプルにするために分数で処理してから表示用の「○時○分」に変換する処理をかけてます。
まとめ
導入してみて、意外と役に立ってます。
スムーズに伝達できたり、必要な情報の通知が自動で来るのはやっぱり便利ですね。
将来的には全てを統合した製品やサービスが作られるんだろうけれど、微妙に痒いところに手が届かない止まりのサービスで大半が終わると感じてます。特に日本のサービスや開発は...
開発費用はraspberry pi3とmicroSDで7000円ぐらいです。
amazonからの購入がオススメ
電源挿しっぱなしにはこちらがおすすめ
実装については特につまづくことなく6時間程度で構築できました。
今の時代、様々なサービス・API・モジュールがリリースされており、繋ぎこみの部分と実行処理のコーディングに注力すればいいので、私みたいなディレクターなのかデザイナーなのかコーダーなのかよくわからない人間でもここまであっさりと出来てしまうんだなと感じました。
次は音声認識でのコマンド実行や家電(照明、エアコン)との連動まで実装していきます。たぶん音声認識でつまづきそう・・