部屋のCO2濃度が上昇したら自動で換気扇をつける
ちょっとやりたくなったので表題のIoT的な仕組みを作ってみました。
経緯
この記事を読んだのがきっかけです。
半分以上は家で作業しているので部屋のCO2濃度のせいで作業効率が落ちるのは嫌なのでひとまず計測してみました。
結果16畳ほどある部屋でも1人で何時間か作業すると1000ppm程度までは上がってしまい、定期的に窓の開け閉めをしていましたがそれも面倒になって自動化に至りました。
構成
(webhook) Raspberry pi -----> IFTTT-------> Smart plug ----> 換気扇 | ↑ | (usb) | (「換気扇をつけて」) | | CO2測定器 Google Home
換気扇がコンセントの電源のON/OFFで操作できるという少し特殊な部屋なのでこの構成で良いのですが、スイッチのON/OFFが必要な場合はSmart plugの代わりに「Switch Bot」のような商品が必要でそれだったらやってなかっただろうなと思います。
やったこと
買ったCO2測定器は下記です。
カスタム (CUSTOM) CO2モニター CO2-mini
- 出版社/メーカー: カスタム
- メディア: Tools & Hardware
- この商品を含むブログを見る
こういう機器は安物を選んでもキャリブレーションとかがちゃんとできておらず不正確な情報を得られてしまうので慎重に選びたいところ。
前に尊敬するRailsの作者でもあるDHHがco2meter.comは大丈夫と行っていたのでそこのOEMであるらしい上記製品を購入しました。
Consumer warning: Do not trust the VOC and CO2 readings from @myfoobot devices. Here are three of them placed in the same room. Real CO2 as measured by a https://t.co/V1Rjw0qxtv device is 519ppm. Garbage. pic.twitter.com/IrRoWb9fOL
— DHH (@dhh) 2017年11月9日
情報取得するために常に動いているサーバーが欲しいが自宅には常時稼働のデバイスはなかったのでRaspberry pi 3 Model Bを購入。最近はこういう商品でAmazonでの発送元が代理店の場合ちゃんとしているところか調べるのが面倒なのでヨドバシを利用してます。
https://www.yodobashi.com/product/100000001003490456/
2AのUSB電源(2.5Aが本当は必要)とディスプレイとHDMIケーブルとキーボードは必要でしたが家にあったので購入したのはRaspberry piだけですみました。
設定は下記サイトを参考にしたら問題なく完了。
次にSmart PlugはIFTTT対応必要なのですが中国製のものばかりで少し怪しかったのですが、それ以外を探すのも面倒なので下記を購入しました。
Google Home対応しているのでGoogleの審査は入っていて怪しい動作はしないはずと信じていますが、ちょと怖いような気もします。気にする場合はamazon.comで良いのを選んで購入するのが良いかも。
届いてセットアップしてみたところ、アプリはちゃんとしていて動作は問題ありませんでした。
そしてIFTTTで下記を設定します。
- IF "Webhook" Then "Meross (Turn on)"
- IF "Webhook" Then "Meross (Turn off)"
簡単ですね。
最後にRaspberry piからwebhookを飛ばすだけです。usbデバイスから情報を取得するのはroot権限だと楽なのでrootで作業しちゃいます。
まずは必要なライブラリのインストール
apt-get install libudev-dev libusb-1.0-0-dev pip install hidapi co2meter
下記のスクリプトを /root/co2d.py とかで配置。スクリプトの内容としては毎分値を取得して1000を上回ったらつけて600を下回ったら止めています。pythonあんまり得意じゃないのでコードは適当。
#!/usr/bin/env python import co2meter as co2 import time import os import sys from datetime import datetime def main(): mon = co2.CO2monitor() triggered = False while True: try: current = mon.read_data_raw()[1] print(current) if current >= 1000 and not triggered and datetime.now().hour >= 8 and datetime.now().hour < 23: print('CO2 value is over 1000ppm!') os.system('curl https://maker.ifttt.com/trigger/co2-over/with/key/hogehoge') triggered = True if current <= 600 and triggered: print('CO2 value is under 750ppm:)') os.system('curl https://maker.ifttt.com/trigger/co2-under/with/key/fugafuga') triggered = False except Exception as inst: print(type(inst)) print(inst.args) print(inst) sys.stdout.flush() time.sleep(60) def fork(): pid = os.fork() if pid > 0: f = open('/var/run/co2d.pid','w') f.write(str(pid)+"\n") f.close() sys.exit() if pid == 0: main() if __name__=='__main__': fork()
でdaemonで動かすために下記のような /usr/lib/systemd/co2d.service 作成
[Unit] Description=CO2 Monitoring Daemon [Service] ExecStart=/root/co2d.py Restart=always Type=forking PIDFile=/var/run/co2d.pid [Install] WantedBy=multi-user.target
systemctl enable co2d.service systemctl list-unit-files | grep co2d
リブートしてps -ef
でdaemon起動を確認できればOK。
雑感
楽しいので他にもいろいろなもので試してみたくなるものの、有用なケースはなかなか思いつかないのが悲しいところです。
少しずつ部屋の明かりの音声操作とかも取り入れてきていますが、気をつけているのは一緒に暮らしている人がストレスを感じないようにするところです。
・少しの便利さのために不便を強いることにならないように ・少しずつ導入してなれてきたら次のデバイスを入れる ・Google Homeで操作するときのニックネームを工夫して操作を楽しめるようにする
などなど。
次は草木の水やりのために水の乾き具合を計測できたらいいなとか思ったりしています。