ソラカメを使って「寝坊した自分がライブ配信されるIoTシステム」を作った！

本記事は [SORACOM Advent Calendar 2022](https://qiita.com/advent-calendar/2022/soracom) の16日目の記事です。

もはや毎年恒例となりました「SORACOMを使って○○を作ってみた」を、今年もお披露目させていただきます🙏
(これまでに作ったシステムはこちらを参照ください)

- [SORACOMとM5Stackを使ってポケベルを現代に復刻させた](https://qiita.com/Y_uuu/items/9c781f269167d73ee262)(2020年)
- [SOSした同僚を確実にお助けするためのIoTパトランプを作った](https://zenn.dev/y_uuu/articles/aac958991e8cb6)(2021年)

----

さて、今年作ったのはずばり **「寝坊した自分がライブ配信されるIoTシステム」** です🎉

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/5cf8e9ac-10a6-4115-74ec-6cf57d6fca09.png)

## 背景

私が所属する [株式会社Fusic](https://fusic.co.jp/) のIoTチームは、毎朝9:30にSlackのHuddleに集合して、朝ミーティングをしています。
しかし極稀に、9:30までに起きることができず、朝ミーティングに遅刻をするメンバーがいます。

![team-iot_-_fusic_-_Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/e242908d-29b6-2ee6-7d8e-8425273a7d15.png)

Fusicではコアタイムなしのフルフレックス制を導入しており、労務管理上は何時に出社してもOKです。朝ミーティングも社内的なミーティングなので遅刻してもリカバリーは可能なのですが、「他人の時間を奪わない」という点で意図せぬ寝坊は防ぎたいです。

どうすれば「寝坊を防げるか？」を **真剣に** 考えた結果、「寝坊した自分がライブ配信されるIoTシステム」があれば、より緊張感を持って朝が迎えられるのでは？という結論に至ったため、作ってみることにしました。

![aws_drawio_—_drawio-saves.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/4e72a740-2e23-a445-9c5d-8fa0b900d7a5.png)

※もちろん、今回作ってみたものの、本当に運用するかどうかは各メンバーに委ねています👌

## ソリューション

ソリューションを考えるにあたり、よく寝坊をするメンバーにヒアリングしたところ、以下のような意見が出ました。

- 寝坊した自分がライブ配信されるとなると、なんとしても早起きすると思う
- 一方で、寝坊していないのに部屋の様子がクラウドにアップロードされるのは嫌だ

これらを踏まえ、以下のようなソリューションを考案しました。

![aws_drawio_—_drawio-saves.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/da2ba68e-84db-1167-9714-58814820fc8d.png)

重要視した点として、 **デバイス側で寝坊したかどうか判定し、寝坊したときに初めてソラカメに電源供給する** ようにしています。
これなら普段の様子が撮影されたり、クラウドにアップロードされる心配はありません。

なんだか実現できそうな気がしてきました💪

## 実現方法

今年もデバイス側とクラウド側に分かれて開発を進めました。
例年通り、デバイス側は @NJL7502L に開発を依頼しました。

### デバイス側

デバイス側はマイコン(ATmega328P)を載せた基盤を用いて、USBポートへの電源供給をスイッチングできるようにしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/f33561b1-2ed3-933d-415b-0aaedbe97270.png)

今回は基板上のボタンをトリガとしており、 **「朝9:25の時点で1回もボタンを押されていない場合」** に「寝坊をした」とみなし、ソラカメの電源をONするようにしています。9:30までに1回でもボタンが押されれば「起床した」とみなしてソラカメの電源はOFFとなります。

カメラを使うIoTシステムでは、撮影した動画をクラウドにアップロードすることに際してプライバシー上の問題がついて回りがちなのですが、この方式であれば「寝坊をしない限り動画が撮影すらされない」ことを担保できます。安心ですね。

回路図・ソースコードは [こちら](https://github.com/njl7502l/suyasuya-streaming)

### クラウド側

クラウド側は毎朝9:30にEventBridgeでLambda関数を起動し、 [ソラカメAPI](https://users.soracom.io/ja-jp/tools/api/reference/#/SoraCam/getSoraCamDevice) を使用してソラカメの接続状況を確認します。

![aws_drawio_—_drawio-saves.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/65a81b48-c1b2-31dc-d486-84656ba45fd1.png)

以下画像のように、APIのレスポンスに **「ソラカメ対応カメラが現在クラウドに接続されているかどうか」** が含まれているのでこれを利用して判定します。今回のようなユースケースが想定されていたのかは定かではありませんが、素晴らしいAPI仕様ですね。

![リファレンス__SORACOM_API_リファレンス___SORACOM_API_利用ガイド___ソラコムユーザーサイト_-_SORACOM_Users.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/99e21864-4fe3-eb6b-68b9-a9b0bbba1e30.png)

ソラカメが接続されている(＝電源がONとなっている)ことを確認できた場合は、再び [ソラカメAPI](https://users.soracom.io/ja-jp/tools/api/reference/#/SoraCam/getSoraCamDeviceStreamingVideo) を使用してストリーミング情報を取得し、そのままS3へPUTします。

S3にて静的サイトホスティングをし、HTMLファイルを配置しておきます。このファイル内で [dash.js](https://github.com/Dash-Industry-Forum/dash.js/) というnpmを使用してストリーミング再生するようにしています。これをCloudFrontで配信をしつつWAFでIP制限することで、社内からのみ視聴できるようにしています。さすがに全世界から視聴可能にしてしまうのはリスクが大きすぎるためです。

ソースコードは [こちら](https://github.com/yuuu/sleep-live)

## 動作確認

9:30時点で起床していない場合に、Slackにこのような通知が来ます。

![iot-poc_-_fusic_-_Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/2c795d39-60db-0991-909b-e1eaca94805c.png)

リンクをクリックすると寝坊した人が見事にライブ配信されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60996/db3e6823-7c92-da65-3a8e-68d6ad0dc3e0.png)

ATOM Cam2は暗いところでも綺麗に撮影できると謳われていることもあり [^1] 、幸か不幸かはっきりと寝姿を捉えることができてしまいますね。(実際に撮影した部屋は薄暗い状態でした)

なお、ライブ配信は5分で終了します。以降、ライブ配信は打ち止めとなり同じURLにアクセスしても再度視聴することはできません。

## よくある質問

- [質問] ソラカメAPIで動画をエクスポートできる時間には72時間/月の制限があるはずだが、問題はないか？
    - [回答] ライブ配信は5分で終了するので、仮に毎日寝坊したとしても72時間の範囲に収まり、全く問題ありません。
- [質問] IoTで寝坊した人を起こす仕組みは考えなかったのか？
    - [回答] なるほど！次の機会に検討したいと思います。

## まとめ

ソラカメを使うことで、動画をストリーミング配信するハードルがかなり下がったことを実感できました。

IoTシステムの開発において「現場の様子を遠隔から確認したい」という声は少なくないので、ぜひ活用していきたいと思います。

[^1]: https://www.atomtech.co.jp/products/atomcam2