この記事は旧ブログサービスからの移植記事です。
表示がおかしい場合があります、ご了承ください。
この記事は 公立はこだて未来大学 Advent Calendar 2022 8日目の記事です。
前回はきーちゃんによる 情シスでも、デザインしたって良いじゃない? でした。
概要
最近 Google Pixel Watchを買ったので、スマートウォッチを利用したプロダクトが欲しくなりました。
そこで思いついたのが表題の 「手を振ったら部屋の電気を消す魔法」です
デモをしている動画です、Aviutlでサクッと作りました
今回の開発で作成したコードはこちら(動けばよかろう&書き殴りのものになります)
環境
今回のプロダクト周辺環境は以下のとおりです。
-
クライアント
- Google Pixel Watch (Wear OS 3.5)
- SwitchBot ハブミニ (ファームウェアバージョンV3.6-23)
-
開発環境
- Windows 10
- Android Studio Dolphin | 2021.3.1 Patch 1
-
利用ライブラリ(代表的なもの)
- Jetpack Compose
- Retrofit
- Moshi
- okhttp
自分は部屋の電気をSwitchBotシリーズを利用して制御しているため、今回はSwitchBot WebAPIを叩く形で開発を進めました。
SwitchBotとは
SwitchBotシリーズは部屋をスマートホーム化することができる便利デバイス群のことです。
普段はSwitchBotアプリやGoogleアシスタントからSwitchBotを操作することでエアコンの電気をつけたり、部屋の照明をつけたり、カーテンを開けたりすることができます。
これだけでも優秀なのですが、更にSwitchBotシリーズが優れている点としてWebAPIが公開されていることにあります。
WebAPIは、以下のGitHubリポジトリにて叩き方を調べることができます。
https://github.com/OpenWonderLabs/SwitchBotAPI
開発する
今回作るものを整理すると
“何かしらのモーションを検知” したら “SwitchBotのWebAPIを叩く” ことによって “部屋の電気が消える”
というものになります。
まずは “何かしらのモーションを検知” の部分を作り込んでいきます。
何かしらのモーションを検知
モーションの検知には “加速度” を利用します。
加速度は `getSystemService(SENSOR_SERVICE) as SensorManager` を利用してマネージャーを取得した後に、よしなに利用します。
詳しくは以下のコードや記事が参考になると思います。余裕があれば今度記事書きます。
参考記事
Android Wearの加速度センサーを使う方法 | Workpiles
で、加速度が取れたら次はモーションの検知です。
これはかなり単純な思想で
”各パラメータの変化量を計算し、変化量がしきい値を超えていた場合に検知判定を出す”
というもので満足できます。コードは以下の通り。
SwitchBotのWebAPIを叩く
では実際にWebAPIを叩きましょう。
事前準備としてSwitchBotアプリからAPIキーを取得しておく必要があります。
方法は簡単で
-
プロフィール > 設定 > アプリバージョン で出てくるアプリバージョンを10回タップ
-
設定に開発者向けオプションが表示されるので遷移
-
トークンゲット
の流れになります。
トークンを獲得したら実際にAPIを叩いてみましょう。
部屋の照明を操作するにはデバイスIDが必要です。
しかし、Android側でデバイス一覧を取得して部屋の照明のデバイスIDを見つけて叩くというのはまぁまぁ面倒です。データの保持とか整形とか、やってる暇がありません。
そこで、デバイス一覧を取得するプログラムをPythonで適当に書きました。これを利用して今回はデバイスIDを決め打ちます。
Pythonは一人で使い捨てのプログラムを書くときほんとに強いですね、おすすめです。
さて、以上のプログラムを叩くとたくさんデータが流れてくるので、そのうち対象とする照明デバイスをなんとか見つけ出してデバイスIDを特定します。
僕の環境下では以下のようなものを取ることができました。
(デバイスIDなどはフェイクを入れていますが、概ね形は一緒だと思います)
{'deviceId': '
52-485158541123-45454842', 'deviceName': 'リビング照明', 'remoteType': 'Light', 'hubDeviceId': 'JI1AD8S78497'},
デバイスID ’ 52-485158541123-45454842’ が取れたため、これを利用してAPIを叩きます。
今回叩くAPIは Command set for virtual infrared remote devices にある turnOn と turnOffになります。
実際に叩く際は
https://api.switch-bot.com/v1.0/devices/\*ここにデバイスID\*/commands
に対してトークンと一緒に(command,parameter,commandType)を送信してあげます。
この辺の実装についてはおそらく見たほうが早いと思います。
部屋の電気が消える
ここまでできたら実際に利用してみましょう。雑な精度で電気が消えます。
問題点
一気に書きなぐったので結構問題山積みです。列挙しておきます。
-
(おそらく)アプリがフォアグラウンドにいないと動かない
- バックグラウンドで動かす処理を書いていないので、多分動きません。
-
電池消費がえげつない
- こればかりは仕方がない感があります。今後のデバイス進化に期待。
-
ステータスチェックしてからオンオフの分岐をするべき
- サンプルコードでは最初電気がついている想定で組んでいます。ヤバいですね。
-
モーション検知が2重以上行われる可能性が否定できない
- 多重チェックしてません。ヤバいですね。
-
精度が低い
- パラメータいじるのは本質ではないと思ったので調整をしていません。調整するともっと実用的になると思います。
-
デバイスID決め打ってる
- 自分しか使わないしいいかーと思って決め打ってます。
余裕ができた頃に治すかもしれません。治さないかもしれません。
この記事を参考にWearOS開発をしようという方は気をつけていただければ幸いです。
まとめ
投稿ぎりぎりになってしまって申し訳ないです。技術的な部分は割りと省きました。(多分読者層にAndroidエンジニアさんそんなにいないからいいよね…?ね…?)技術的な部分については別の機会で知見を残せるといいなーと思っています。
今回はスマートウォッチを利用して部屋の電気を消すというプロダクトに挑戦してみました。
SwitchBotのWebAPIは結構利用するのが簡単で、SwitchBotを利用しているエンジニアの方ならぜひAPI叩いてみてほしいなと思いました。意外とできることも多そうです。
きれ~
公立はこだて未来大学は、このように日常的にエンジニアリング(笑)みたいなことをしている学生がまぁまぁ居るおもしろ大学です。
校舎も結構綺麗ですので、この記事を読んで大学に興味を持たれた方はぜひ足を運んでみてください。
また、今週末から学内ハッカソンp2hacksも開催されます(運営やってます)。こちらも併せてウォッチしていただけると幸いです。
明日は
明日(8日目)はこた君の記事です。Kotlinいいよね。お楽しみに!
おまけ
本当はFitBitAPIから睡眠を検知して電気敷毛布を自動で消すってのをやりたかったです。
いろいろ調べてみると一癖ありそうで、結局実装することはありませんでした。
これについても別記事で知見を残せるといいですね。(記事を書く時間がない)
https://www.reddit.com/r/PixelWatch/comments/zdxz1c/can\_use\_fitbit\_apis\_device\_api\_from/
拙い英語で聞いてみたりもしてた