2018年5月15日0件のコメントこんにちは。GMOアドマーケティングのT.Iです。Netatmoウェザーステーションをご存知でしょうか?Netatmoウェザーステーションは屋内外の環境を計測するモジュールで、スマートフォンと連携することで様々な環境(気温や湿度、騒音など)をほぼリアルタイムで計測することが出来ます。気温や湿度であればその他様々な製品でも計測することが出来ますが、この「Netatmoウェザーステーション」の特徴は二酸化炭素(CO2)濃度を可視化出来ることです。今回は、そのCO2濃度をSlackに通知するシステムを作成したので、その”きっかけ”と開発方法について紹介いたします。きっかけ社内にNetatmoウェザーステーションを導入するきっかけは以下の記事でした。記事では「CO2濃度が個人のパフォーマンスに大きく影響する」と紹介されています。実際に社内でも夕方辺りから空気が重く感じたり集中が続かないと言った声があり、その原因の一つと考えられるCO2濃度を可視化することで仕事のパフォーマンスを改善できるのではないかとの意見が出たため、今回の仕組みを導入することになりました。モジュールの4種類が販売されています。今回は二箇所にモジュールを設置してCO2濃度を可視化したかったのですが、ウェザーステーションの子機ではCO2濃度を可視化できないとのことだったので、追加で屋内用の追加モジュールを購入しました。購入した2つのNetatmoウェザーステーションを社内の二箇所に設置し、説明書通りに初期設定を済ませるとWeb上やスマートフォンアプリで各計測値を確認することができます。今回は「CO2濃度が設定した閾値を超えるとSlackに通知する」という仕組みを作りたかったので、まずは簡単に導入できる「IFTTT」を使ってSlackと連携することにしました。IFTTTでの設定方法は割愛しますが、CO2濃度が設定した閾値を超えた(もしくは下回った)ことをトリガーに設定できたので、以下のような通知フォーマットでテスト運用を始めました。IFTTTの仕様上フォーマットの限界は諦めがつきますが、IFTTTの連携では実際に運用する中でいくつか気になる点がありました。通知がかなり遅れる先程のスクリーンショットの例でもわかりますが、場合によっては通知が数時間遅れることがありました。IFTTT側で「ある閾値を下回ったときにも通知」するように設定することで換気の効果も可視化していたのですが、閾値を下回った通知と超えた通知のタイミングが逆転することもあり、リアルタイム性が重要な今回のシステムではあまり使い物にならない結果となりました。先程も少し触れましたが、IFTTTでは詳細の制御ができないので、例えば「時間の表記をわかりやすくしたい」「SlackのAttachmentを細かく設定したい」「深夜帯は通知したくない」などの要件を満たすことができません。通知が遅れる問題はクリアしたかったので、IFTTT連携からAPIを使った自作の通知システムへ移行することにしました。Connectからアプリケーションを作成する必要があります。secret」が発行されるので、この情報を元にデータを取得します。APIについては公式のリファレンスが充実しています。公式のリファレンスには様々な言語のSDKやサンプルコードが公開されていますが、今回はRubyを使ってデータを取得してみます。Rubyの場合は以下のコードでウェザーステーションのデータを取得できます。JSON.pretty_generate(data)JSON形式でモジュールの情報や計測データが返ってくるので、あとは欲しいデータを取り出すだけです。今回はメインのモジュールに追加のモジュールを接続した状態でしたが、上記のコードで双方のモジュールのデータを取得することができました。Slackには「モジュールが計測した時間」「CO2濃度」「モジュール名」をポストしたかったので、以下のようにデータを取得しました。モジュールの名前は初期設定時に設定したモジュール名をJSONから取得してもいいのですが、今回はRuby側でわかりやすい名前をつけてます。data['body']['devices'][0]['modules'][1]['dashboard_data']['CO2']}あとはcronで定期的にデータを取得し、取得したCO2濃度がある閾値を上回った(もしくは下回った)ときにSlackへ出力するようにコードを実装するだけです。下回った」ときに通知をするように制御できます。Spreadsheetを使って実装することにしました。Slackへの投稿方法はいくつかありますが、Rubyを使う際はslack-incoming-webhooksを使えば簡単に導入できます。色で表現すれば視覚的にも非常にわかりやすくなります。Spreadsheetへも出力しました。Spreadsheetへの連携はこちらのgemを使えば簡単に導入できます。導入方法は今回の記事では紹介しませんが、社内では以下のフォーマットで運用しています(数値はサンプルです)。Netatmoの管理画面でも推移は確認できますが、制御の柔軟性と社内でSpreadsheetでの運用が浸透していることからSpreadsheetでの管理を採用しました。APIでCO2濃度をSlackへ通知する方法を紹介しました。今回の仕組みを社内に導入することで、Slackへの通知を切っ掛けに換気や空調の調整をしたり、CO2濃度が上がるタイミングにフリースペースへ移動したりなど、個人のパフォーマンスを改善するファーストステップになったと思います。実際に社内でも・夕方に集中力が続かない原因が可視化されて気が楽になった・換気を習慣化することで夕方頃に感じていた「空気の重さ」を感じにくくなった・換気後の効果がリアルタイムで通知されるのでわかりやすい・Spreadsheetで時間毎の傾向がつかめるので換気の運用が効率的になったなどの意見が出てきました。APIには他にも様々なAPIが公開されているので、今後も検証しながら社内環境の改善に活用していきたいと思います。@gmoap_engineer本ブログで発信される情報は、各エンジニア個人の見解であり、弊社の公式見解ではありません。本ブログに掲載、引用等をしている商品またはサービス等の名称は、各社の商標または登録商標です。その他の事項について一切責任を負いかねます。発表する情報には注意を払っておりますが、公式発表、見解については、弊社WEBサイトおよびプレスリリースなどをご確認ください。GMOインターネットグループにおけるソーシャルメディア運用ポリシーについては次のページをご確認ください。本ブログに掲載のあるソフトウェアのダウンロードは自己責任で御願い致します。ソフトウェアのダウンロードの結果、ご利用者に何らかの損失・損害が生じたといえども、当社ではその責任を負いかねます。本ブログに掲載のあるソフトウェアを扱う際は、各ソフトウェアの公式リファレンスを参照のもとご使用下さい。ソフトウェアの実行の結果、ご利用者に何らかの損失・損害が生じたといえども、当社ではその責任を負いかねます。