▶︎

1ポチ! 勉強時間記録の物理ボタンを作ってみた [Toggl Track]

に公開

勉強時間や仕事時間の記録をしたい。だけど

  • スマホを出してタップするのすらめんどくさい
  • 何回も止め忘れるうちに、結局挫折してしまった

という経験はありませんか?私は前世からずっとです。

今回は SORACOM LTE-M Button Plus を使って、どこでもただ物理ボタンを押すだけで勉強や仕事の時間を記録開始したり、ストップできる工作をしてみました。

soracom_button

このボタンに1クリックで勉強の記録を開始、2クリックで仕事の記録を開始、長押しで記録の停止をどこでも行えます。

初期費用としてこのボタンの購入に8,000円ほどかかっていますが、ランニングコストはほとんどない計算です。

楽しみながらブログを書けて、おまけに役に立つので実質タダですね。

この工作の背景・モチベーションは折りたたんでおります。興味がある方はご覧ください。

私は勉強やブログ執筆などの習慣化には結構自信がある方で、以下のようなブログで定期的に勉強の成果などをアウトプットしております。

https://zenn.dev/moneyforward/articles/893eb6f50bd896

ただ、それら勉強の成果をより明確にしたり、自分のモチベーションのための「本当は何時間くらい勉強したと言う記録をちゃんと残した方がいいんだろうな」とはずっと思っていました。

私の尊敬する方などは、モバイルアプリを使って時間計測の停止の押し忘れを予防していました。

https://dev.classmethod.jp/articles/toggl-track-desktop-app-solving-timer-problems/

私の場合、例えば英語学習などをする時にPCなどは使わずにノートやKindle端末だけで勉強することもあります。その時にスマホのアプリを開いて、履歴から勉強の時間計測を押すことすら面倒な時があるのです。

そこで、どんな時にも軽くて小さい物理的なボタンがあれば、ポケットの中に忍ばせてお散歩しながら英語の音楽を聴いている時間ですら、面倒にならずに続けられるのでは?と思いました。

その点、SORACOMを使うことで IoT にありがちな端末の証明書問題やプロトコルなどをあまり考えずに、プログラム的な処理に集中できそうと言うことで、今回工作をしてみました。

仕組み

ほとんど以下のブログに書いてあるとおりなのですが、ボタンを押した先の到達点には AWS Lambda があり、そこでボタンの押し方(シングル、ダブル、長押し)に応じたイベントを仕込んでいます。

https://users.soracom.io/ja-jp/guides/design-patterns/button/aws/

design

Lambda などの基盤を作成

今回は Terraform を使って基盤を作成しました。詳しい構成は以下のリポジトリに配置していますので、興味があればご覧ください。

https://github.com/bun913/soracom-toggl-button

少し解説があった方が良い部分を抜粋してご紹介します。

Lambda 関数を作成している部分は以下になります。今回は Toggl Track のAPIを利用するにあたり、APIキーなどの情報を環境変数に持たせることにしました。

https://github.com/bun913/soracom-toggl-button/blob/b653810b548de43dfe4b51cdddb9bdf5dbe154aa/lambda.tf#L27-L46

本当に厳重に守るなら、 Secrets Manager などに格納して Lambda関数から参照させる手段もありますが、今回はそこまでの対策はしておりません。

また、機密情報などを万が一にでも git push などしてしまうことを防ぐため 一度 Systems Manager Parameter Store に各種秘密文字列の箱を作成した後に、AWSマネジメントコンソールより手動で更新して、再度 terraform apply をすることで、Lambda の環境変数に必要な情報を流し込んでいます。

https://github.com/bun913/soracom-toggl-button/blob/b653810b548de43dfe4b51cdddb9bdf5dbe154aa/parameter_store.tf#L8-L26

今回は SORACOM Funk という仕組みを使って、ボタンが押されたイベントを処理して Lambda関数を呼び出してもらいます。その時に、 SORACOM Funk 側に IAM Role の権限を使って、Lambda を実行する権限を渡せるようにIAMロールを用意しています。

https://github.com/bun913/soracom-toggl-button/blob/b653810b548de43dfe4b51cdddb9bdf5dbe154aa/iam.tf#L2-L85

arn:aws:iam::762707677580:root というのは SORACOMの日本カバレッジ(私はリージョンのようなものと理解しています)で利用しているAWSアカウントIDです。(後ほど紹介する公式ドキュメントにも出てきます)

SORACOM のダッシュボードで各種設定を行う

まず SORACOM のアカウントを作成して、以下のサイトでボタンを購入しました。

https://soracom.jp/store/5207/

私の場合は注文から3日後に配達されました。大満足です。(注文日は日曜日でした)

届いたあとは、本当に公式サイトの通りに設定することがほとんどなので、申し訳ありませんがリンクを貼り、必要な部分のみ説明します。

https://users.soracom.io/ja-jp/guides/design-patterns/button/aws/

認証情報の登録

まずは先ほど Terraform で作成していた IAMロールを利用できるように認証情報をSORACOMダッシュボードから設定します。

https://users.soracom.io/ja-jp/docs/credentials-store/usage/

この時ロールARNと外部IDにはTerraformで作成したIAMロールのARNと、ランダム文字列を指定しましょう。

外部IDの確認方法はいくつかありますが、以下のように作成した soracom-iot-toggl-soracom-funk-role の信頼されたエンティティから確認することもできます。

external_id

残りは、(再掲ですが)スタートガイドのとおりに設定しました。

https://users.soracom.io/ja-jp/guides/design-patterns/button/aws/

Lambda のコードを書く

あとは以下のように Lambda の本体となるコードを記載します。

https://github.com/bun913/soracom-toggl-button/blob/b653810b548de43dfe4b51cdddb9bdf5dbe154aa/lambda/toggl/lambda.ts#L142-L235

ボタンの押され方によって、どのような時間を記録するかの制御が変わります。

以下はイメージですが、私はシングルクリックの時には勉強(ピンク色)、ダブルクリックの時には仕事(青色)といったように記録されるようにしています。

sample

また、長押しで今実行中の記録が停止されるので、「あれ?終わったっけ?」などと不安になった時には画面を見るよりも早くとりあえず長押ししておくことで、時間の止め忘れをあまり気にせずに済みます。

感想

すごく良いです。

わかるんですよ。本当に私がスマホアプリ開いてポチって押すだけで良いのは。でも、勉強時間の記録という私にとって直接的な利益のなさそうなものを習慣づけるのには、できるだけ面倒を排除したかったのです。

今回 SORACOM 様を初めて利用させていただきましたが、とても体験がよかったです。面倒な証明書管理やIoT Core などの設定をせずに、Lambdaだけ気にすれば良いのは本当によかったです。

他にも面白そうな製品がいくつもあるので、また今度色々試してみたいと思います。

以上、最後までご覧いただきありがとうございました。

GitHubで編集を提案
Money Forward Developers

Discussion