テレワーク環境の可視化
2020年3月からテレワーク(Work From Home)が始まり、常時同じ部屋にいることも増えたこともあって、いくつかのデバイスを24/7で稼働させることを始めたけど、やりたかったとこまで一旦終わったのでブログにまとめてみました。
現在はこんな感じにモニターの下に置いて使ってます。
室温と湿度の可視化
まず最初にやったのが、M5StickCにFreeRTOSを入れて、DHT11センサーモジュールで室温と湿度を収集し、Raspberry Pi 3上で動いているAWS IoT Greengrass v1(v1.11.0)を経由してAWS IoTにデータを送っている。 IoT Coreで受け取ったデータはRuleの設定で、AWS CloudWatchのメトリックスとして登録され、その情報を使ってダッシュボード機能で可視化した。 ついでにAmazon QuickSightでも見れるようにしたかったので、AWS IoT CoreのRuleでAWS IoT Analyticsにデータを送り、Amazon QuickSightに取り込んでダッシュボードを作成している。
アーキテクチャ的には、以下のようになっている。
二酸化炭素濃度
部屋を閉め切ってオンライン会議をしていると、頭が痛くなってくることも多く、二酸化炭素濃度を可視化したいと思いつつ、一年近く経ってしまったが、やっと作業をした。
ダッシュボードで可視化するのはもちろんだが、二酸化炭素に関しては最新の情報だけ見れればいいと思い、だいぶ前に購入したM5Paperも丁度あったので、これを使って表示することにした。 色々と情報を収集していたら、同じ様にM5Paperで可視化をしている人がおり、気象情報やアイコンとかは参考にさせてもらった。
二酸化炭素が表示したい、AWSに溜め込んでいるデータを表示したいということもあり、結局以下のようなアーキテクチャに落ち着いた。
センサーデータの収集は、以下の動きに変わった。
- M5StickCでFreeRTOSのアプリが動き毎秒、温度と湿度をGreengrassに対してPublish
- サブスクリプションの設定で、M5StickCから来たデータでGreengrass上のLambdaを起動
- Lambdaは起動されると、MH-Z19BからCO2の値を取得し、3つの値をまとめて、IoT CoreにPublish
- IoT CoreのRuleでDynamoDBに最新のデータを更新(CloudWatchとIoT Analyticsに送るのは変わらない)
これで、収集したデータをM5Paperから参照出来るようになった。
次に、M5Paperの動きは以下のようにしている
- 5分毎にAWS IoT Coreに接続し、データ受け取り用のTopic(B)にSubscribe
- 最新データを取得するようにTopic(A)にPublish
- IoT CoreのRuleのSQLでDynamoDBからデータを取得し、Topic(B)にre-Publish
- M5Paperで受信したデータを描画
- 30分ごとにOpenWeatherMapのAPIから現在の天気情報を取得し、描画
AWSに溜め込んだデータを取得するのに、API Gatewayなど使わなかった理由としては、そのために認証の仕組みを実装するのがめんどくさかったからだけです。AWS IoT Coreにはassume roleの仕組みもあり、一時的な認証トークンも取得できるので、それを使ってAPI Gatewayに認証させるのもやり方としてあるので、実際はそっちのほうが綺麗かもしれない。
M5Paperの描画
canvasは以下のような作りになっており、タイミングによって描画される場所が異なる。
- 起動時に青い領域を描画
- OpenWeatherMapの情報取得時に、オレンジとピンクの領域を描画
- AWSに溜め込んだデータを取得した際に、緑色とピンクの領域を描画
M5PaperのソースコードはGitHubに上げてあります。
可視化
CloudWatchのダッシュボードはこんな形。
QuickSightのダッシュボードはこんな形。
追記 5/11
CO2のモニターを始めて最初のWFHのグラフがこちら。
作業している寝室の広さは6畳間で、天井の高さは2.4mぐらい。 頭が痛くなるので、いつも部屋のドアを開けたまま作業を開始しているが、実際にどれぐらい変化があるか見たかったので、午後はドアと窓を閉じて作業をしました。途中、カミさんが荷物を取りに部屋に入ってきたり、トイレにいく以外は閉めっぱなし。
徐々に上がっていくのが確認できたし、タイミングによってはかなり高い数字となっているのもわかる。ということで、定期的に換気をするのが良さそうですね。
追記 9/10
長く運用していたら、表示がだんだんとこんな感じになってきた。
リセットすると直る。
部分的な上書きだけで更新しているので、今の処理があまり良くないのかもしれない。そもそも、電子ペーパーだから数分ごとに更新する使い方自体が良くないのかもしれないな。