部屋の二酸化炭素濃度が高くなったらgoogle nest hubからお伝えする


家で料理をしたりパーティしたり騒いだりしていると、知らず知らずのうちに結構二酸化炭素濃度が高くなっていることがあります。

二酸化炭素濃度は1,000ppmを超えるとよくないみたいです。

そこで、二酸化炭素濃度が高いとgoogle nest hubを使って二酸化炭素濃度が高いよとお伝えできるようにしてみました。

前提

  • Raspberry piの初期設定が終わっていること
  • 二酸化炭素濃度計(MH-Z19C)とジャンパーケーブルが手元にあること
  • googleのアカウントを持っていること

事前準備

  • 物理的にRaspberry piとMH-Z19Cを接続する (はんだ付け不要、ジャンパーケーブルのメスで接続)
    • ここの絵が一番わかりやすいです

  • ジャンパーケーブルはこんな感じでくっついて送られてきて、こんな感じで裂いてちぎって使います。この写真はメスメス(F-F)のケーブルで、これを使います。

cable3.png

  • シリアル通信を有効にする
    • 以下のページを参照して実施しています

  • raspi-configを実行
    • sudo raspi-config
  • 3 Interface Options→P6 Serial Port→
    • Would you like a login sheel to be accessible over serial? -> いいえ
    • Would you like the serial port hardware to be enabled? -> はい
  • reboot
    • shutdown -r now

データを取得

  • ライブラリをインストール(こっちはハイフン)
pip3 install mh-z19
  • 動作を確認(こっちはアンダーバー)
sudo python3 -m mh_z19
  • これで二酸化炭素濃度がとれちゃったはずです。すごくすんなりできてびっくりした記憶があります
  • もし、値が入らない方がいらっしゃったらラズベリーパイへの電力が足りていないのかも。USB-CへUSB-HUB経由で接続していると値が入らないことがありました。

スクリプト

  • pythonスクリプトを書きます
co2_get.py
import mh_z19

sanso_node = mh_z19.read()
print(sanso_node)

f=open("/{ファイルの保存場所}/co2_value.txt","w")
msg = str(sanso_node['co2'])
f.write(msg)
f.close

  • ファイルに現在の値を書き込むスクリプトです
$ sudo python3 co2_get.py
{'co2': 855}
  • cronを設定
    • これでco2_value.txtというファイルに5分に1回co2濃度が出力されるようになったはずです
*/5 * * * * python3 /{ファイルの保存場所}/co2_get.py

node redの事前準備

  • node redのinstallは以下URLを見てください
    • bash <(curlから始まるスクリプトをたたくと入ります
    • そのあと、apt updateとapt upgradeを実施してリブートします
    • 自動起動も設定しておきます
      • sudo systemctl enable nodered.service
    • node redをstart
      • node-red-start

  • ブラウザに、http://<ip-address>:1880を入力してログインします
  • google home (google nest hubでもOK)を使うためのノードを入れます
    • パレットの管理からnode-red-contrib-castを検索して追加
    • 以下ページ参照

node redの設定

  • 以下を作ります
  • これで一度タイムスタンプを押したら、5分おきにスクリプトで取得した二酸化炭素濃度を取得し、二酸化炭素濃度が1,200ppmより高かったらgoogle nest hubへ二酸化炭素濃度が高いとしゃべらせることができるようになったはずです

co2_nodered.png

  • タイムスタンプ
    • inject
  • co2濃度の読み込み
    • exec
    • コマンド: cat /{ファイルの保存場所}/co2_value.txt
    • 引数: msg.payload
    • 出力: execモード
    • 名前: co2濃度の読み込み
  • switch
    • switch
    • >= 1200 → 1
      • ↑この1200が閾値です。私は二酸化炭素濃度が1,200ppm以上のときにしゃべるようにしています
    • その他 → 2
  • function
    • function
msg.payload = "2階の二酸化炭素濃度が高いです" + msg.payload + "ppmです。換気してください。"
return msg;
  • google nest hubへcast
    • Cast
    • IP: google nest hubのIP address
    • language: ja
    • Name: google nest hubへcast
  • delay 5m
    • delay
    • 時間: 5分