サーチサービス開発Gの前田です。サーバーサイドのエンジニアとして活動しています。
主な業務はレストラン検索周りの開発に加えてリファ隊(リファクタリング隊)活動です。
前回は、家を出る前に忘れものをしないようにするための仕組みを作成。出社時にIDカードと傘を忘れないようになりました。
初めてのIoTだったこともあり、あまり深く考えず手元にあったMESHで作ってみたため、改善したい点がちらほら(※後述)ありました。そこで、Raspberry Piを活用して、気象情報の通知機能を本格的に改修。外出前により精度の高い情報を知れるようになりました。
進化したプロダクトを紹介したいと思います。
概要(なにを作ったか)
これが構成となります。おおまかな処理の流れを説明すると
- 玄関に設置した人感センサーが人が通ったことを取得し、処理の開始
- OpenWeatherMapのAPIを叩いてその日の天気情報を取得
- 取得した天気情報をSlackに通知
となります。
過去に作成したプロダクトを改善
前回は、MESHタグを用いて「IDカードを忘れないようにする」「雨の日に傘を忘れないようにする」ことを目的としたプロダクトを作成しました。
前回のプロダクトの課題点は3つ。
- 毎朝7時55分時点での湿度情報を取得し通知させていたため、それより前に家を出た場合、無意味になる
- MESHタグが取得した湿度から天気を予測するには限界がある
- MESHタグのLEDタグをIDカードにつけると首が凝る
新卒として入社してある程度経ち、IDカードは忘れないようになった(たぶんw)ので、今回改善したいのは1と2です。
そのため、家を出るタイミングでその日の精度が高い気象情報を得たいと考え、以下の物を準備し実装いたしました。
準備するもの
今回は以下を準備しました。
Raspberry Pi Zero W
新しいもの好きの血が騒ぎ、最新のもの(※買い物した当時)を使いたくなったのでRaspberry Pi Zero WをGET。Raspberry Pi Zero W本体、miniHDMI変換アダプタ、USB-microB OTGケーブル、MicroSD、電源がセットで4000円くらい。Raspberry Pi Zero W本体のみだと1300円くらいです。人感センサー(SKU-20-019-157)
秋月電子通商で400円です。ハンダ付けセット
Amazonで1000円くらいです。OpenWeatherMapのAPIを使用するためのアカウント
無料です。こちらは後ほど説明いたします。
必要なものを調達するため買い物へ
まずはRaspberry Piと人感センサーの購入からスタート。僕は大阪出身なので東京に詳しくありません。 ということで秋葉原に詳しい同期の長岡くんを召喚。
秋葉原を案内してもらい、Raspberry Piと人感センサー(SKU-20-019-157)を購入しました。付き合ってくれてありがとうございます!
購入した人感センサーとRaspberry Pi Zero W。どちらもコンパクト!!
Raspberry Piと人感センサーのセットアップ
購入したRaspberry Piを起動させます!小さい頃に、親に買ってもらったゲームを初めて起動するときと同じような気分ですw
microSDカード、ディスプレイ、USB経由のキーボードとマウスを接続した後、ドキドキワクワクしながら電源を入れます。
専用OSのRaspbianをインストールし、無事トップの画面が出ました!
次にRaspberry Piの電源を落とした状態で、GPIOピンをハンダ付けします。
ハンダ付けをしているところの写真です
続いて人感センサーをGPIOピンに接続します。メス-メスの線を持っていなかったので、岩田直樹さんに相談したらもらえました。ありがとうございます!
GPIOピンと人感センサーはこのように接続しました。
Raspberry Pi | 人感センサー |
---|---|
DC 5V(4番ピン) | + |
GPIO(18番ピン) | out |
GND(6番ピン) | - |
気象情報はOpenWeatherMapのAPIを利用
気象情報は、開発者用APIを無料で提供しているOpenWeatherMapというサービスを使います。 api.openweathermap.org/data/2.5/forecastがエンドポイントです。これに都市名、緯度経度、city IDをqパラメータに指定することにより、その地域の天気、気温、気圧、雲量、風速、風向の情報を手に入れられます。
APIキーはこちらからアカウントを作成すると取得できます。
実装
フラグ管理と人感センサーの反応を取得する処理の実装
DB(MySQL)を用いた1日1回通知するためのフラグ管理と、人感センサーが反応したことを取得するコードがこちらになります。このrun.pyをRaspberry Pi内で永久的に走らせています。
本プロダクトは家を出るタイミングで気象情報の通知を受け取ることが目標なので、玄関に人感センサーを設置することを前提としています。 靴を履く際5秒ぐらいかかると思いますが、その間ずっと人感センサーが反応し、連続して同じ通知がくると煩わしいです。帰宅時に気象情報の通知が来ても煩わしいです。
よって、1日に1回通知するためのフラグ管理が必要となります。以下が簡単な説明となります。
15-29行目 getFlag()
DBに保存している通知状態を取得しています。
31-42行目 updateFlag()
フラグを0にし通知状態を「済み」にしています。
44行目以下
人感センサーが反応し、通知状態が「未通知」だったらweather.phpとupdateFlag()を実行します。
initializeFlag.py
フラグを1にし通知状態を「未通知」にするpythonのスクリプトを別で用意しています。
このスクリプトをcrontabを用いて毎朝3時に自動で定期実行させています。
00 03 * * * python initializeFlag.py
気象情報取得とSlackへの通知の実装
OpenWeatherMapのAPIを用いて天気情報を取得したのち、文言を整形しSlackへ通知するコードがこちらになります。
OpenWeatherMapは海外のサービス。レスポンスが英語なので、rainという文字列が存在する場合、その情報を通知するようにしています。このAPIを使うと3時間おきごとに天気情報を取得できます。
見やすいように文言を整形し、SlackのAPIを叩いて通知しています。
結果:家を出るタイミングで通知が届くように
人感センサーを用いたことによって、家を出るタイミングで通知が来るようになりました。
雨天かどうかの判定の精度も前回より上がり、より正確な情報が分かるようになりました。
ふりかえり:ネジの感度を調整する方法が難しい
人感センサーの感度が良すぎたからか、誤認識が多くありました。人感センサーについているネジを回して感度を調整しようとしたものの、人感センサーはWebにも紙でも仕様書がなかったので途方にくれました……。
結局、ネジを何度回すと感度がプラス or マイナスになるのかをトライアンドエラーでさぐり当てることに。この作業がしんどかったです。
そして、電源問題が解消されていません。Raspberry Piは電源が必要なので、トイレから電源を伸ばしています。何か良いソリューションはないでしょうか?w
玄関に一番近いコンセントはトイレの中
そのまま玄関までコードを伸ばします
スリッパ置き場の下に配置
これがちょっと煩わしいですw
おわりに
今回は前回のMESHを使ったプロダクトを改良し、Raspberry Pi Zero Wを使ったプロダクトを作成致しました。 初めての経験が多く、先輩に質問し完成までたどり着きました。ご協力ありがとうございました。 IoTや電子工作に慣れてきた(たぶん)ので、今は市販のダーツボードを利用して、専用のAndroidアプリも作りオリジナルのダーツゲームを制作しています。
デフォルトで701やクリケットなどのゲームが用意されていますが、もっとおもしろいぶっ飛んだゲームで遊びたいためです。
いろんな困難にぶつかると思いますがそれが楽しみです。何としても自分のオリジナルのダーツゲームを完成させます。
乞うご期待!!
※2018/03/08 16:18 一部内容に修正を加えました。
お知らせ
ぐるなびでは生活をちょっと良くする仕組みを作るのが好きなエンジニアを募集しています