Eyes, JAPAN Blog > 空気センサーで数値化した二酸化炭素濃度をWebexにGASで自動通知する

空気センサーで数値化した二酸化炭素濃度をWebexにGASで自動通知する

Taeko

この記事は1年以上前に書かれたもので、内容が古い可能性がありますのでご注意ください。

コロナウイルス対策でマスクや消毒が当たり前のものになってきています。
Eyes, JAPANではマスクや消毒はもちろんのこと、換気にも気をつかっています。

「こまめな換気をしましょう」
という呼びかけを聞くことはありませんか?

しかし、ここで少し疑問になるのではないでしょうか。
こまめってどのくらいの頻度なんだろう…?
(↓こんな感じにグラフとかで空気の状態が見れたらいいのに…)

換気をしたい

厚生労働省によると『30分に一回以上、数分間程度、窓を全開』で窓による換気ができます。

しかし雪の降る会津地区では冬に頻繁に窓を開けると凍えてしまいます…(蒸し暑い夏なら溶けてしまうだろう…)。リモートワークを行うスタッフも多いEyes, JAPANでは出社するスタッフの人数も日によってまちまちです。何かしらの指標をもとに換気を行いたい…。

再び厚生労働省によると『必要換気量を満たしているかを確認する方法として、(中略)二酸化炭素濃度が1000ppmを超えていないかを確認することも有効』とのこと。つまり二酸化炭素濃度を計測して、その数値によって換気をすれば良いのではなかろうか!

ちなみに、ppm(百万分率)とは「100万分のいくつか」という単位です。
1ppm = 0.0001%とも表すことができます。

ということで今回は、換気できているのかどうかの指標として二酸化炭素濃度を利用してコロナ対策を行って行きます。CO2センサーとして、Netatmoというセンサーを設置しました。Netatmoは二酸化炭素濃度の測定だけではなく、温度・湿度・気圧・騒音(拡張すると雨量など)も計測できます。

CO2センサー、Netatmo

Netatmoの設置は手順に従ってアプリのインストールをし、表示される指示に従ってWi-Fiに接続するだけです。何も問題が起きなければ10分もあれば完了です。
(ただWi-Fiが2.4GHzのみ対応なところには注意です…私は苦戦しました…)

Netatmoはアプリから下の画像のように二酸化炭素濃度が確認できます。
文字での表示では気温なども一気に見ることができます。
グラフでの表示も可能なので1日の二酸化炭素濃度の変化なども確認することができます(窓を開けて換気すると目に見えて二酸化炭素濃度が下がるのがわかります)。下の画像では1日のグラフですが、日、週、月、年単位でもグラフ化することが可能です。

設置している様子は下の画像のようになります。
iPadのアプリでは位置情報に基づいた天気予報、グラフなどが表示できます。
iPadの右の細長い筒が親機です。Wi-Fi接続されています。
その右に置いてある親機より小さめの筒は子機です。電池で動き、屋外に設置できます。

二酸化炭素濃度のグラフのみを表示した時の画像は下のようになります。

さらに使いやすくするために…

しかしオフィスにいる間、常にアプリから確認しないですし、それは非効率的…。
Eyes, JAPANでの連絡に使っているWebex Teamsに通知することができれば、アクティブのスタッフも多く、すぐに気づくことができるのではないか、と考えました。
そこで、ある二酸化炭素濃度を超えたら「窓開けてね!」と促すbotを作成しました。

Webex Teamsのbotの作り方は、『Webex TeamsとAdaptive Cardsで名言集ボットを作る』という記事と同じ要領で作成しました。

Netatmo Developersからログインし、必要な情報を取得します。
ログイン後、マイページから”CREATE”をクリックし、”app name”などいくつか情報を入れると”Client ID”、”Client Secret”が発行されます。”Device ID”などはMyNetatmoの”設定”をクリックし、”家を管理”をクリックした先で知りたいデバイスを選択すると取得することができます。

Google Apps Scriptを書く


function getStationsdata() {
  // ボットアクセストークン
  var botAccessToken = "(ボットアクセストークンの値を記入してください)";

  // スペースID
  var roomId = "(スペースID (roomId)の値を記入してください)";

  // WeatherStation constant
  const TOKEN_URL = 'https://api.netatmo.com/oauth2/token';
  const STATION_DATA_URL = 'https://api.netatmo.com/api/getstationsdata';
  const DEVICE_ID = 'XX:XX:XX:XX:XX:XX(IDを記入してください)';
  const CLIENT_ID = 'XXXXXXXXXXXXXXXXXXXXXXXX(IDを記入してください)';
  const CLIENT_SECRET = '(Client Secretを記入してください)';
  const USERNAME = '(Netatmoのユーザーネームを記入してください)';
  const PASSWORD = '(Netatmoのパスワードを記入してください)';

  var auth_request = {
    'grant_type': 'password',
    'client_id': CLIENT_ID,
    'client_secret': CLIENT_SECRET,
    'username': USERNAME,
    'password': PASSWORD,
  };
  var auth_options = {
    'method': 'post',
    'contentType': 'application/x-www-form-urlencoded',
    'payload': auth_request
  };
  
  // tokenを取得
  var auth_response = UrlFetchApp.fetch(TOKEN_URL, auth_options); 
  var auth_json = JSON.parse(auth_response);
  var access_token = auth_json.access_token;

  var station_request = {
    'access_token': access_token,
    'device_id': DEVICE_ID,
  };
  var station_options = {
    'method': 'post',
    'contentType': 'application/x-www-form-urlencoded',
    'payload': station_request
  };
  
  // stationデータを取得
  var station_response = UrlFetchApp.fetch(STATION_DATA_URL, station_options); 
  var station_json = JSON.parse(station_response);
  var station_data = station_json.body.devices[0].dashboard_data;

  // 室温、湿度、気圧、CO2濃度、騒音
  var temp = station_data.Temperature;
  var humidity = station_data.Humidity;
  var pressure = station_data.Pressure;
  var co2_ppm = station_data.CO2;
  var noise = station_data.Noise;
  
  // teamsに送信されるメッセージ内容
  var alert_data = {
    'roomId' : roomId,
    'text': 'CO2 ALERT! Open the window or door!\n' + 'CO2: ' + co2_ppm + 'ppm\n\n' + 'Temperature: ' + temp + '℃\n' + 'Humidity: ' + humidity + '%\n' + 'Pressure: ' + pressure + 'mb\n' + 'Noise: ' + noise + 'db\n'
  };

  // CO2濃度が1500以上の時にスペースに通知
  if(co2_ppm < 1500){
    return;
  }

  // alert_dataをスペースへpost
  var url = "https://webexapis.com/v1/messages";
  var payload = JSON.stringify(alert_data);
  var options = {
    'method' : 'post',
    'headers' : {
      'Content-Type' : 'application/json',
      'Authorization' : 'Bearer ' + botAccessToken
    },
    'payload' : payload
  };

  UrlFetchApp.fetch(url, options);
}

botが下の画像のようにつぶやきます。

botを導入してみて

1人でも部屋にいるスタッフが増えると、グラフの傾きが非常に大きくなります(笑)
「こんなにすぐ二酸化炭素濃度が上がるのか!」と、とても驚きました。
それと同時に「見えるようになるの、すごい!」という可視化の大事さに気づきました。

スタッフの意見

スタッフからさまざまな意見が出たので、それを紹介します。

・ちょっと通知うるさくない?

最初は1000ppm以上で通知していたのですが、1000ppmにはすぐ到達してしまい、通知が何度も何度も来てうるさい…という意見です(笑)
厚生労働省などの規定上は1000ppmなので、1500ppmに変更するのはどうなんだろう…という意見も出ました。もはや快適な空間にするなら800ppmにするべきでは?など。
しかし仕事に影響が出るレベルであれば、1500ppmにした方がいいのでは、ということで現在1500ppmでbotは動いています。

・今まで午後になると頭が痛くなることがあったのに、少なくなった!

コロナ対策以外での良い影響でした。私自身実感しました。
今までも大人数で集まっていたりご飯を食べている時など、頭が痛くなったり気分が悪くなることが多かったのです。もしかしたら二酸化炭素濃度が高くなっていたからかもしれない、と思いました。

・通知が来るのは良いけど、雨や雪の日に窓を開けるのは難しい

廊下のドアを開けて換気する、というのが現実的な解決策です。
窓を開けて外の空気を取り入れる方が早く換気することができますが、廊下のドアを開けて上手にサーキュレーターを使うことで、換気していくことも大事な技術です…笑

・1日の終わりに今日の二酸化炭素濃度をパッと見れるグラフを送るbotも作ってほしい

現状アプリで見れるものの、アプリをわざわざ開く必要がなく、良いかも…。

・騒音の指標ってお喋り防ぐ意味で通知してる?(おまけ)

確かに大声で話すのを控える、という意味では使える指標かもしれません。
ただ音楽を流していたりするので、あまりあてにならないかもしれないですね…
これは気温、湿度、気圧など含め得られる情報全てを投稿させようと思っただけです…!

スタッフにも思ったより好評でよかったです。
頭痛が減るなどコロナ対策以外のメリットもあるので、さまざまな場所に取り入れていけたら良いのではないかと思います!

Comments are closed.