LoginSignup
5

More than 3 years have passed since last update.

posted at

updated at

Organization

fitbitを活用して睡眠を良い感じにコントロールするアプリが作れるか設計してみた

・ 日々、パフォーマンスを最大限に発揮し、残業を限りなく0にして時間的自由を手に入れる。
・ 美容・健康の維持増進をする(睡眠時間が短いと太りやすいとも言われますし)
・ 単にスッキリ目覚めたい!

そんな方々のお役に立てるかもしれない目覚ましアプリ(Android or iOS)が作れるか設計してみました。
本投稿では、実際にプログラミングまでは行なっていませんのでご了承ください。
(作り込もうとすると、非常に時間がかかりそうな予感 [特にテスト] がしたので。。。悪しからず。。。)

「へ〜、fitbitを活用すると、こんな事も出来る(かもしれない)んだ〜」

くらいの軽い気持ちで読んで頂き、ご参考になれば幸いです。

利用するfitbit API

・GetSleepLogs API
API仕様はこちら

アプリの設定項目

 起床目標時間

ピッカー等で入力させ、ストレージに値を保存しておく。

 睡眠目標時間

こちらもピッカー等で入力させ、結果をストレージに保存する。
選択肢は90分単位で「9時間、7.5時間、6時間」。
ロングスリーパーやショートスリーパー向けに10.5時間、4.5時間を用意しても良いが
選択時にアラートで警告を出す。

アプリの機能概要

 自動睡眠促し機能

起床目標時間と睡眠目標時間から逆算し、就寝時刻の2時間前からnotification通知を始める。
(そろそろ、寝る時間ですよ〜)

通知タイミングは、就寝時刻の2時間前、1時間前、1時間後。
もし、使用者が「寝た判定」された場合は、通知は行わない。

 寝た判定機能

fitbitは「必要に応じて 15~30 分毎に自動的に同期」されるらしい。(参考
よって、アプリは定期的にfitbit web apiをリクエスト(ポーリング)し、睡眠に入ったかを判定する方式とする。

具体的には、GetSleepLogs APIの [date] に本日の日付 [yyyy-mm-dd] を設定して10分間隔でリクエストする。

レスポンスJsonの "sleep" 配列のオブジェクトをチェックし、
"isMainSleep": true となるオブジェクトが存在していれば「寝た」と判定する。

「寝た」と判定されたら、レスポンスJsonの "startTime" と 睡眠目標時間 を加算し
暫定起床時間 とする。もし、 暫定起床時間 が 起床目標時間 を超える場合は
(ちょっと可哀想だが、遅刻したら大変なので) 暫定起床時間 を 起床目標時間 に差し替える。

暫定起床時間 が決まったら、ポーリングは停止する。

 自動起こし機能

暫定起床時間 の1時間前から、 GetSleepLogs APIのポーリングを再開する。
"isMainSleep": true となるオブジェクトの "levels.data" 配列内の
最新のタイムスタンプの"level"を取得し、前回の"level"と比較する。

  1. "deep" -> "light" -> "rem" -> "wake" と順調に覚醒に向かっている場合は、アラーム等は鳴らさない。
  2. "light" -> "deep" など、眠りが深くなる変化の場合は、アラーム等は鳴らさない。
  3. "wake" -> "rem" と変化したら、アラーム等を鳴らす。(睡眠が深くなりそうなので、浅いうちに起こして目覚めスッキリ!)
  4. 1 or 2 において、 暫定起床時間 に到達してしまったら、スマホのアラーム等を鳴らす。

fitbitは、実際に寝ていた時間を取得できる!?

ここまでは、もしかしたらfitbitを使わなくてもスマホの加速度センサー等々をフル活用すれば出来るかもしれません。
fitbitのすごいところ(というか筆者のお気に入りの機能)は、「ベッドに寝そべっていた時間」と「実際に寝ていた」時間が区別できる点です。

例えば、6時間横たわっていたとしても、気温が適温でなかったり、その他の要因で睡眠が途中覚醒してしまう事があります。
自覚できる場合もあるでしょうが、意外と無自覚な途中覚醒もあります。
そうすると、「あれ〜、沢山寝たはずなのに、なんか寝た気がしないなぁ〜」といった事になるのではと(個人的には)思っています。

これを解決すべく、自動起こし機能にモードを1つ追加します。

 自動起こし機能(実際寝た時間で起こすモード)

このモードがON(アプリの設定項目から選択してね)の場合、前述の1〜4に以下を加える。

5. "isMainSleep": true のオブジェクトの minutesAsleep が 睡眠目標時間 を超えた場合、かつ、 "level" が "rem" or "wake" の場合は、アラーム等を鳴らす

いかがでしたでしょうか

API仕様書に細かい記載が無いので、大いに想像が含まれていますがご了承ください。
いつか筆者が実際にアプリを作成し、設計の妥当性が判明しましたら追記等いたします。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
5