Help us understand the problem. What is going on with this article?

お前ら今すぐ換気しろ!【GAS×Messaging API ×MH-Z19】

なにやったのか3行で

Raspberry Pi上に二酸化炭素センサ(MH-Z19)を実装し、二酸化炭素濃度を計測した。
Google Spread Sheetへ二酸化炭素濃度を転記し、一定の二酸化炭素濃度を超えた場合、LINE BOTを使って換気を促すシステムをGASを使って構築した。
換気をする時間がわからないため、換気後に一定の二酸化炭素濃度を下回った場合も通知するようにした。

はじめに

Motivation

IT業界は他の業種に比べて働く場所の制約が少なく、昨今のご時世によりテレワーク等の制度を使って自宅に引きこもっている人も多いでしょう。(自己紹介)

二酸化炭素濃度が上昇すると、下記のように体に様々な症状が出てくるようになります。(めまい、倦怠感、眠気など)
CO2_yoko_bar.png
http://group.chcsys.net/jp/chcgroup/ourbrand/co2_controller/ より画像拝借)

そのため、公共の場や職場環境ではCO2濃度に一定の基準が設けられており、おおよそ1000〜1500ppm(1%~1.5%)以下にしなければならないと決まっているようです。

頭が動かないのはエンジニアにとって致命的。効率を高めるために朝活を始めたり、高級椅子を購入するなど、色々やっていますが、二酸化炭素濃度を管理もエンジニアがしなければならないことなのです!

二酸化炭素計高い!!

「じゃあ二酸化炭素計買って定量評価してみるか〜」と思い、Amazonを覗いてみると1万円(!)超え。
温度計の感覚(1000円くらい)で買おうとしていた私はこの段階で躊躇したものの、色々調べてみると二酸化炭素濃度センサが1500円程度で買えることが判明しました。
センサがあるならラズパイとつないで何でもできるじゃん!ということで、センサ情報を取得するだけでなく、換気が必要なタイミングをLINEで通知することで何も考えることなく換気ができるようなシステムを構築しました。

システム全体像

システム構成図は以下の通りです

<システム構成図>

①ラズパイ上にCO2センサ(MH-Z19)を実装
②ラズパイからGoogle Spread SheetへCO2データを送信
③GASを用いてLINE BOT(Messaging API)を送信

二酸化炭素センサの実装

MH-Z19はUARTシリアル通信というもので測定値を取得します。
Raspberry Piの配線は、以下の配線図を参考に行います。
https://pypi.org/project/mh-z19/ より引用)
68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34363534342f30383238333031342d363864322d633364652d313634342d3763386439623762363266642e6a706567.jpg

実装が完了したら以下のコマンドを実行。

$ sudo echo "enable_uart=1" >> /boot/config.txt
$ sudo pip3 install mh-z19
$ sudo reboot  #再起動
$ sudo python3 -m mh_z19
{"co2": 1155} #CO2濃度が出力されればOK

上記のように、CO2濃度が出力されればひとまず完成。

Googleスプレッドシートへのデータ送信

ラズパイ上でPython実行により、Googleスプレッドシートへ測定値を送信していきます。

準備

以下の記事を参考にスプレッドシートの共有まで実行してください。
PythonでGoogleスプレッドシートを編集

コード

下記のpythonファイルを1分ごとに実行するためにcronへ登録。必要なライブラリは適宜pip installしてください。

# pip3 install gspread oauth2client
co2_out.py
import subprocess
import json
import datetime
import gspread
from oauth2client.service_account import ServiceAccountCredentials

# MH-Z19から測定値を取得
args = ['python3', '-m', 'mh_z19']
res = subprocess.check_output(args).decode('utf-8')
res = json.loads(res)
co2_concentration = res['co2']
time_now = datetime.datetime.now()

scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']

# JSONファイルの中身をそのまま転記
credential = {
  "type": "service_account",
  "project_id": "xxxxxxxx",
  "private_key_id": "xxxxxxxxxxxxxxxxxxxxxx",
  "private_key": "-----BEGIN PRIVATE KEY-----\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "client_email": "xxxxxxx@xxxxxxx.iam.gserviceaccount.com",
  "client_id": "xxxxxxxxxxxxxxxxxxxxxxx",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/xxxxxxxxxxxxxxxx.iam.gserviceaccount.com"
}

# Googleスプレッドシートは測定値を追記
credentials = ServiceAccountCredentials.from_json_keyfile_dict(credential, scope)
gc = gspread.authorize(credentials)
wks = gc.open('homeCO2').sheet1
rowToAdd = [time_now.strftime('%Y/%m/%d %H:%M:%S'), co2_concentration]
wks.insert_row(rowToAdd) # グラフ描画のために一番上に測定値データを挿入(シートには昇順でデータが格納される)

crontab
・・・
* * * * * python3 /home/hogehoge/co2/co2_out.py  #crontabへ上記のpython実行を追加

下記の様に測定値データが反映されれば成功です。
スクリーンショット 2019-12-08 10.23.07.png

ここで、直近1日ごとのグラフを確認してみましょう。
同ファイルの別シートのA1〜B1440へ「=INDIRECT("シート1!"&address(row(),column()))」を記載してください。
スクリーンショット 2019-12-08 10.26.53.png
これが直近1日(24時間×60分)分の測定値になります。
スクリーンショット 2019-12-08 14.09.30.png

図を見ても分かる通り、人が活動している間のCO2濃度は徐々に上昇し、換気をすると一気にCO2濃度が低下していることがわかります。
正直、CO2濃度の感度がここまで高いと思っておらず、換気の重要性を実感しました。

LINE BOTによる通知システムの構築

ここからは、LINEが提供しているMessagingAPIを利用して一定のCO2濃度を(1200ppm)を超えたら換気を促す通知を出し、あるCO2濃度(500ppm)を下回ったら換気完了の通知を出すシステムを構築します。

LINE公式アカウントの開設

すでにLINE公式アカウントの開設は完了しているため割愛しますが、下記が参考になると思います。
LINE BOTの作り方を世界一わかりやすく解説(1)【アカウント準備編】

GASの設定

先程作成したスプレッドシートを開き、「ツール」→「スクリプトエディタ」を選択します。
スクリーンショット 2019-12-08 13.48.28.png
「無題のプロジェクト」部分を押下し、名前を記入します。
スクリーンショット 2019-12-08 13.48.54.png
スクリーンショット 2019-12-08 13.49.56.png
下記のjavascriptをコピーし、保存します。

pushToLine.gs

「公開」→「ウェブアプリケーションとして導入」を押下し、下記の設定で保存をします。
スクリーンショット 2019-12-08 14.20.12.png

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3131313332342f37653661666264302d366230332d646135382d353338342d3730343736343466333039632e706e67.png

初めて実施する場合には下記の様なエラーが出る場合がありますが、認証をすると使えるようになります。
68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3131313332342f66656337373331362d613962322d353165312d633732632d3139303437656432613433302e706e67.png

払い出されたCallback URLをWebHookにコピーすれば完成です。
※Callback URLが有効になるまで時間がかかるようです。「検証する」を押下し、エラーが帰ってきてもしばらく待ってみましょう。
68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3131313332342f65633333623734302d663038332d386534322d636164662d3763396237323732383766332e706e67.png

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3131313332342f64623834313564652d666332302d366263622d623434362d3837353534333930396365382e706e67.png

実装結果

成功するとこのようになります。
IMG_3853.PNG

まとめ

なんとなく頭がぼーっとするなーと思ったときに通知が飛んでくるのを見ると、酸素って大事。

参考

[Google Apps Script] LINE Bot を作ってみよう

tororu
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした