【IoT&スマートホーム】寝過ごしたときに起こしてくれる目覚まし時計の製作
朝、確実に目を覚ますための工夫の1つとして、寝過ごし防止アラームという装置を作ってみました。普通の目覚まし時計と異なり、寝過ごしたと思われる場合にだけ、スマホの目覚まし機能を動作させます。
これはIoT技術を利用した簡単なスマートホームの実現例です。
リビングルームでの活動状態を光センサーでキャッチし、部屋が暗い場合にだけスマホのアラームを起動します。
この記事は2017年に自宅サーバーで公開していた内容を再編集しています。
インテリジェントな目覚まし時計
普通の目覚まし時計は、決まった時間にアラームを鳴しますが、「寝過ごし防止アラーム」は寝過ごした場合にだけ通知します。すでに起きて活動中と判断できる場合は、アラームによる通知を行いません。
普段とは違う目覚まし音を使うことで、遅刻に対する緊急事態を知らせるのが目的です。
スマホアプリでは、普段の起床時刻+αの時刻を設定しておきます。その時刻になるとアプリが自動起動して、リビングルームの活動状態を確認します。30秒以内にリビングルームの照度が一定以上であることを確認できない場合、寝過ごしたとみなしてアラームを鳴らします。
起動時刻の「+α」は普段の起床時刻の後、これ以上寝過ごしたら遅刻する時間に設定します。そのため、普段から遅刻寸前で行動しているα≒0な方にとって、この目覚まし時計の起動は遅刻の確定を意味します。
システム構成
構成上、寝室とリビングで役割が別れます。装置の役割を明確にするため部屋を分けていますが、もちろん同じ部屋で使うこともできます。
リビングルームにはマイコン(今回はESP8266)と光センサーを組み合わせたデバイスを置いておきます。リビングルームの照明が点灯しているときは光センサーの値が大きくなるため、「起きている」と判断します。
ベッドルームには「寝過ごし防止アラーム」がインストールされたスマホを置いておきます。寝過ごした場合にだけスマホアプリが起こしてくれます。
マイコンとスマホアプリは、IoT向けのクラウドサービスでつなげます。クラウドサービスには、今回もKii株式会社のIoTプラットフォームを使用しました。
デモ
動画によって動作を説明します。
無事に起きられた場合:リビングのセンサーが明るい状態で起床予定時刻+αを迎えると、寝室にあるスマホのアラームは鳴らず、そのまま終了します。
寝過ごした場合:センサーにカバーを掛けてリビングが真っ暗な状態を再現しています。起床予定時刻+αを迎えると、30秒後に寝室のアラームが鳴ります。
仕組み
スマホがリビングルームの状態を得るまでの流れは次の通りです。
スマホとマイコンの通信には、Kii株式会社のIoTプラットフォームより、「Thing Interaction Framework(Thing-IF)」の機能を使用しています。
スマホとマイコンの間では、Thing-IFの「コマンド」と「コマンドリザルト」を送り合って情報をやりとりします。
スマホでは、設定した時刻になったら専用アプリが自動起動します。アプリでは、クラウドにThing-IFのコマンドを送信すると、クラウドサービスは、あらかじめ関連づけられたマイコンに「checkSensorAction」コマンドを届けます(図の 1~2)。
コマンドを受け取ったマイコンESP8266 は、光センサーの値を読み取ります(図の3)
マイコンは、部屋が明るければtrue、暗ければfalseのコマンドリザルトをスマホに返します(図の4~5)。
スマホでは、コマンドリザルトを見て部屋の明るさを判断し、false(部屋が暗い)の場合にのみアラーム音を鳴らします。
この機能は、1つの建物の中で完結するため、Wi-Fiでの通信でも実現できますが、スマホのWi-Fiは通信トラブルの温床であるため(個人的見解)、クラウド経由にしました。また、今回は自社製品(別の記事でも書きましたが、私はKii株式会社の中の人です)を使ってみる、いわゆる「ドッグフーディング」の役割を兼ねていたことも理由の1つです。
完成後に気づいたのですが、このシステム構成では朝6時とか7時のように特定の時間ちょうどに大多数のユーザーのリクエストがクラウドに集中するという致命的な問題があります。これは、サーバーの負荷分散の観点からきわめて非効率です。製品化まで想定すると、Wi-Fiのほうが良かったのかもしれません(業務でやらかしたら完全にNGだ)。
ハードウェア
まずは、マイコン側のハードウェアを説明します。
今回は、スイッチサイエンス社のESP-WROOM-02開発ボードを使うことにしました。これはESP8266とその周辺回路がセットになっている製品で、電源の自作を行わなくても、USB電源で運用できます。開発当時は、インターネットに接続できるメジャーなマイコンとして最安でしたが、現在はRaspberry Piのシリーズを使う選択肢もあります。
マイコンには、CDSセル(光センサー)、抵抗、LEDを組み込みました。全体の回路は以下のような感じです。
実験段階では評価ボードを使うのが一般的ですが、今回は常時運用を目的としているため、ハンダ付けしました。本業のハード屋さんから見れば邪道かもしれませんが、ICソケットを2階建てにすることで、周辺回路だけを取り外して本体を再利用できる構成にしています。
LEDは動作確認用です。この種のデバイスはいったん起動すると、動いているかどうかも見た目に判断できなくなりますので、LEDを点滅させる「Lチカ」によって、動作状態を確認できるようにします。
マイコン側の処理
マイコンとクラウドとの通信には、MQTTを使用しました。
次のシーケンス図のような通信処理を行って、スマホからのコマンドを待機して応答する処理を実行しています。
なお、ESP8266でのMQTTプロトコルの利用は、jakaladaさんのブログ記事ESP8266でSangoにパブリッシュしてみるが参考になると思います。
スマホ側の処理
スマホ側は一般的なAndroidの目覚まし時計アプリと同様の実装です。アクティビティとサービスを使って、指定時刻に処理を自動実行します。
起動後は、クラウド経由でリビングの明るさを取得します。
タイムアウトとなる30秒が経過しても照明のオンが検出できなかった場合や、マイコンに接続できなかった場合、アラーム音の鳴動を開始します。
利用しての感想
このソリューションをしばらく使ってみましたが、寝過ごしが発生した際には、普段とは違うアラーム音で無事に起きることに成功しました。
将来のスマートホームでは、照明の電源スイッチや動体センサーなどと連動して、より確実な方法で目覚まし時計が起動することになるかもしれませんが、今回の仕組みだけでも、有用だと感じました。
ちなみに、現在、このシステムは運用を終え、このコンセプトをさらに強化した「緊急時目覚まし」を使っています。この話は次回の記事で。
余談ですが、一度アラームが誤動作したことがありました。起きているのにアラームが鳴るバグか!? …と思ったら、なぜか光センサーの上にこいつが座っていたのでした。