Raspberry Piを使った温湿度CO2濃度ロガーの製作

最近、一条工務店で新居を建てた記事をいくつか書いています。

新居でやりたかったことの1つは、室内の環境を計測し、適切な環境を維持するように空調などの機器の設定をちゃんと調整する(できればそれを自動としスマートホーム化する)ということです。

そこで、まずは温湿度とCO2濃度を計測することにしました。温湿度はSwitchBotなどの便利なセンサがありますが、CO2濃度は選択肢が限られます。既存のスマートホーム製品でCO2濃度が測れるものはいくつかあるのですが、生データ取得が難しいものが多く、Raspberry Piで自作することにしました。

本記事の目次です。

1. ハードウェア

1.1 CO2センサ

いくつか候補がありましたが、作り始めたのがちょうど以下のツイートが流れてきたタイミングだったため、アイ・オー・データのUD-CO2Sを使いました。

UD-CO2Sは、温湿度CO2がUSB接続で計測でき、光学式・キャリブレーション機能がついているタイプです。

ツイートの通り一時期2,000円台まで値下がりしていましたが、あいにく生産終了*1となって価格は徐々に上昇し、現状8,000円くらいで推移してます。これでもまだ定価12,000円の70%で、機能を見れば比較的安価な方だと思います。私は3000~5000円で5台購入しました。

1.2 Raspberry Pi

Raspberry Piは家に転がっていた1A+, 3B+, 4Bを使いました。Pythonソフトで温湿度CO2濃度データの取得をしたのですが、どのRaspberry Piでも問題なく動作しました。Zeroでも動作するんじゃないでしょうか。

Raspberry Pi 4BとUD-CO2Sを接続した写真が以下になります。実際設置するときは、Raspberry PiのCPUも3B~4Bくらいになるとそこそこの熱源になるので、なるべくセンサから離して設置できる場所を探したほう良いです。写真ではUSBケーブルを束ねていますが、私はこれをなるべく伸ばして設置するようにしています。

2. データの取得

2.1 既存ソフトの調査

上記のツイートに、chissokuというデータ取得ソフトが紹介されています。

github.com

こちらはGoで開発されており、LinuxWindowsでそれぞれ動作するバイナリが用意されています。しかし、私の環境ではいずれの環境でも1週間程度継続動作さると必ずエラーで落ちてしまい、その後USBを物理的に再接続しないと復帰できなくなる現象に見舞われました。

そこで、Pythonで計測ソフトを自作することにしました。

2.2 UD-CO2Sのコマンド調査

UD-CO2SはUSBシリアル通信デバイスとして認識されます。以下のコマンド・動作があるようです。

  • STAというコマンドを送ると、最初にOKが返り、その後CO2=644,HUM=43.4,TMP=31.8のような文字列を一定間隔で返す
    • 間隔は2秒ほど、正確に2秒ではないので、リサンプリングが必要
    • OKではなくNGが返る場合、計測値は返ってこない。再度STAを送る
  • STPというコマンドを送ると文字列を返すのを中止する
  • FRC=値というコマンドでで指定した値にCO2濃度をキャリブレーションする

2.3 PythonによるUD-CO2データ取得

上記のコマンドを踏まえて、以下のソフトを作成しました。

github.com

これをRaspberry Piをセットアップして実行させます。*2 動作確認したRaspberry Pi OSとPythonのバージョンは以下です。

  • Raspbian 11.7
  • Linux version 6.1.21-v8+
  • python 3.9.2
  • pyserial 3.5b0

機能としては以下になります。

  • 起動日の日付のCSVファイル(yyyy-mm-dd.csv)を作成する。
  • UD-CO2Sと通信し、取得した温湿度・CO2濃度データをCSVファイルに記録する
    • 温度は高めに出ているようなので、計測値を-4.5℃とする補正をする*3 *4
    • 相対湿度は、補正前温度時の絶対湿度から補正後温度の時の相対湿度を計算し、その値に変更する
  • 日付が変わったらプログラムを終了する
    • 毎日1回ソフトを起動する使い方を想定

このpythonスクリプトを実行すると、CSVファイルに以下の書式で1分毎のデータが記録されます。

datetime, temperature, humidity, co2
2024/01/12 00:00:03, 22.6, 46.8, 1010
2024/01/12 00:00:07, 22.6, 46.6, 1010

キャリブレーション機能はまだつけていません。

2.4 cronによる定期実行の設定

上記のソフトを定期的に実行するよう、cronの設定をします。 crontab -eして、以下を記入します。

0 0 * * * python /home/pi/work/sanketsu.py 2>&1 | tee -a /home/pi/work/co2.log
@reboot python /home/pi/work/sanketsu.py 2>&1 | tee -a /home/pi/work/co2.log

毎日0:00に起動させます。また、@rebootの行も追加することで、Raspberry Piが不意に再起動した際も実行されるようにします。

2>&1より後ろは、Python実行時の標準出力・標準エラー出力をファイル出力するためのものです。

3. 計測場所と実測データの例

家では、主に人がいる2Fの洋室に各1個ずつと、リビングに1個設置して温湿度CO2を計測するようにしました。

典型的な1日のCO2濃度の推移は、以下のような感じです*5

CO2濃度推移の例

いまは寝室(Bedroom)と洋室2(Western2)の2部屋でドアを閉めて寝ているので、これらの部屋のCO2濃度が夜間に高くなります。また昼間は主にリビングで過ごすので、リビングの濃度が高くなり他の部屋は低くなっています。高くとも1100ppm程度で抑えられているのは、ロスガードの計画換気によるものです。

ただ、洋室は給気口が部屋の手前側にあるので、ずっと起きていてCO2発生が多かったりするともうちょっと濃度が上がったりします。今後の部屋の使い方によっては、ドアを開けたり、サーキュレーターを回すなどしないといけないかもしれません。

そのうち、CO2濃度が高くなったらサーキュレーターを回す、みたいな自動化もやりたいと思います。

おまけ:Windowsでの計測(公式ソフト「CO2換気モニター」)

UD-CO2Sは公式でWindows用の計測ソフトが用意されています。常時起動するWindows PCのある部屋なら、PCにUD-CO2Sを接続してこのソフトを使うのが手軽です。

www.iodata.jp

ソフトを起動すると、C:\Users\ユーザー名\AppData\Local\I-O_DATA\CO2換気モニター.exe_Url_flegl41yev3u0r0b0ykag1c51i0d412p\1.1.0.0\logsというフォルダにテキストファイルで計測結果が1週間分保存されます。

1週間より古いものは削除されてしまうので、定期的に別の場所にコピーするタスクなどを用意しておけばよいです。

ファイル名はlogyyyymmdd.txtで1日1ファイルとなっており、以下の書式で1分毎のデータが記録されます。

2023-06-26 00:00:27.190 +09:00 [INF] ,PORT:COM7, CO2:546, TMP:28.7, HUM:56.7,

*1:同様にUSB接続で計測できそうなCO2センサはCO2-miniシンワ測定のものがある

*2:Raspberry Piのセットアップは巷に山ほど記事があるのでそちらを参照

*3:UD-CO2S の温度と湿度を補正する | monolithic kernel

*4:UD-CO2S - oquno公開メモ

*5:このグラフはStreamlitで作成。Streamlitについてもまた記事にするかも