タダケンのEnjoy Tech

楽しみながらラクに成果を上げる仕組みを考える

Mackerelで部屋のコンディションを監視する

f:id:tadaken3:20180926195437p:plain こんにちは!
タダケン(@tadaken3)です。

季節が変わり目で少し肌寒くなってきましたね。

部屋のコンディション(気温・湿度など)はパフォーマンスに強く影響します。

例えば、ジメジメしていると汗が気になって仕方がなかったり、部屋が寒すぎて集中できなかったり。

今回はMackerelNature Remoを使って部屋のコンディションを監視する方法をまとめました。

Mackerelを採用した背景

部屋のコンディションを監視する上で、やりたかったことは、大きく以下の2つです。

  • 自分の部屋の温度や湿度などのコンディションを数分ごとに記録してグラフで可視化すること
  • 温度や湿度などがコンディションが変化したら通知をすること(湿度が高すぎるなど)

とくに大事なのが2つ目の「部屋の状態が変化したら自動でアラートする」という部分です。部屋の温度や湿度を監視するだけなら、Google Apps Scriptとスプレッドシートだけでも実現できます。

しかし、グラフにして計測するだけとなると、都度、自分でグラフを見にいかなければなりません。快適な環境を維持して、プログラミングやブログ執筆に集中したいのに、それはとてもめんどうです。

そこでサーバー管理・監視ツールのMackerelを使うことにしました。Mackerelには、「サービスメトリックス」という機能があり、サーバーに紐付かないあらゆるメトリックを記録・可視化できます。

mackerel.io

サービスメトリックは利用するのも簡単で、メトリックの投稿はシンプルなHTTP+JSON APIで行えます。投稿してしまえばメトリックは自動的にでグラフ化されて、すぐにMackerelのWEBサービスから確認できます。

もともと、サーバー管理・監視のためのサービスなので、しきい値を設定してSlackやチャットワーク、LINEに通知することも簡単にできます。

また、Mackerelは最初の2週間は無料のトライアルプランで利用でき、その後も(機能は制限されるものの)Free プランに自動的に移行するので、コスト面でも安心です。

単純にMackerelはグラフを見ているだけで楽しいというのもあります。ほんとにMackerelは神サービスですね。

湿度や温度の取得は、Nature Remoで行っています。「温度・湿度」のセンサー部分は、ラズパイや他のセンサーデバイスに置き換えることも可能です。

Nature Remo APIからの湿度・気温データの取得とMarkerelへの投稿については、このためにサーバーを用意するのも大変なので、Google Apps Scriptで実装することにしました。ほんとGASは便利ですね。

システム概要をまとめるとざっくりこのような感じです。

f:id:tadaken3:20180926172948p:plain

必要なアカウントの取得など

今回、必要なのはNature RemoのアクセストークンとMackerelのアカウントです。

Nature Remoのアクセストークンを取得する

まずは以下のサイトにログインして、Nature Remoのトークンを取得します。取得したトークンはどこかにメモしておきます。

home.nature.global

Mackerel のアカウントを作成する

次に、Mackerel のサイトに行きアカウントを作成します。Mackerel ではGoogleやGithubのアカウントでサインアップすることもできます。

mackerel.io

Mackerel のAPIトークンを取得する

アカウントが作成できたら、xメトリックを投稿するためにMackerelのAPIキーを取得します。APIキーはダッシュボードの「APIキータブ」で確認できます。

f:id:tadaken3:20180926144505p:plain

Google Apps ScriptでNatureRemoからデータを取得してMackerelに投稿する

それでは、Google Apps Scriptで実装していきます。NatureRemo APIからデータの取得して、整形して、Mackerel投げるという流れです。Nature RemoとMackerel の認証情報は、スクリプトのプロパティに保存してください。

あとは、このスクリプトを時間トリガーで5分毎に実行するだけです。

function main() {

   var prop = PropertiesService.getScriptProperties();
   var natureRemoApiToken = prop.getProperty('NATURE_REMO_TOKEN');
   var mackerelApiKey = prop.getProperty('MACKEREL_API_KEY');
   var serviceName = 'room-condition';//Mackerelのサービス名を入力
   
   var data = getNatureRemoData(natureRemoApiToken)
   var payload = formatToPayload(data);
   postMackerelServiceMetric(mackerelApiKey, serviceName, payload);
}

//Nature Remo APIから部屋のデータを取得する
function getNatureRemoData(apiToken){
  url = 'https://api.nature.global/1/devices';
  var options = {"headers" : {"Authorization" : "Bearer "+ apiToken}};
  res = UrlFetchApp.fetch(url,options);
  return res
}

//Mackerel用にデータを整形する
function formatToPayload(data){
  var jsonData = JSON.parse(data);
  var te = jsonData[0]['newest_events']['te']['val'];
  var hu = jsonData[0]['newest_events']['hu']['val'];
  var epoch = Date.now() / 1000;
  
  var payload = [
    {
      'name' : 'room.temperature',
      'time' : epoch,
      'value' : Number(te)},
    {
      'name' : 'room.humidity',
      'time' : epoch,
      'value' : Number(hu)},
      
  ];
  return payload 
}

//Mackerelに送る
function postMackerelServiceMetric(apiKey, serviceName, payload) {
  return UrlFetchApp.fetch(
    'https://mackerel.io/api/v0/services/' + serviceName + '/tsdb',
    {
    'contentType' : 'application/json',
    'method' : 'post',
    'headers' : {
      'X-Api-Key' : apiKey
    },
    'payload' : JSON.stringify(payload),
    'muteHttpExceptions' : true
    }
  );
}

まとめ

スクリプトを可動させるとMackerelに気温・湿度のデータが溜まっていきます。こんな感じで、グラフを見たり、しきい値を設定してアラートを飛ばすことができます。

f:id:tadaken3:20180926145042p:plainf:id:tadaken3:20180926145045p:plain
部屋の気温・湿度をグラフで確認したり、しきい値を設定してアラートを飛ばしたりできる

Mackerelをうまく使えば、50行ちょっとのコードで部屋のコンディションを管理できて素敵ですね。みなさんも、季節の変わり目で体調を崩さぬようお気をつけくださいな。

最後に少し宣伝です

本ブログでは、プログラミングやIT技術に関するブログ記事を公開しております。もしよければ、Twitterアカウントをフォローもしくは、ブログの読者登録していただけるとうれしいです!

ぜひ、よろしくお願いいたします。

参考サイト

Mackerel サーバ監視[実践]入門

Mackerel サーバ監視[実践]入門

  • 作者: 井上大輔,粕谷大輔,杉山広通,田中慎司,坪内佑樹,松木雅幸
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/08/26
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る