Raspberry Pi + CO2-mini + Zabbixで室内CO2濃度を継続モニタリングする構築手順

Image credit: Tomokatsu Yukishita

コロナ禍をきっかけにCO2モニター「CUSTOM CO2-mini」を購入しました。USB給電で動作するこのセンサー、調べてみるとUSB経由でデータ取得もできることが判明。Raspberry Piに接続してZabbixで継続的に室内CO2濃度をモニタリングする仕組みを作ったので、構築手順をまとめます。

用意するもの

Raspberry Pi

【国内正規代理店品】Raspberry Pi4 ModelB 4GB ラズベリーパイ4 技適対応品
【国内正規代理店品】Raspberry Pi4 ModelB 4GB ラズベリーパイ4 技適対応品
Amazonで見る

CO2-mini(CUSTOM CO2モニター)

カスタム (CUSTOM) CO2モニター CO2-mini
カスタム (CUSTOM) CO2モニター CO2-mini
Amazonで見る

電源・microSDカード

Smraza Raspberry Pi 4 USB-C電源 5V 3A(ON/OFFスイッチ付き)
Smraza Raspberry Pi 4 USB-C電源 5V 3A(ON/OFFスイッチ付き)
Amazonで見る
SanDisk microSD カード 128GB UHS-I U1 Class10
SanDisk microSD カード 128GB UHS-I U1 Class10
Amazonで見る

CO2-miniからのデータ取得(Python)

CO2-miniをRaspberry PiにUSB接続すると、特別なドライバーなしで認識されます。データ取得には heinemml/CO2Meter というPythonライブラリを使います。

ライブラリのインストール

Raspberry Pi OS Bookworm 以降では、システムの Python に直接 pip インストールすることが制限されています。仮想環境を作成してその中にインストールします。

python3 -m venv /root/co2env
/root/co2env/bin/pip install git+https://github.com/heinemml/CO2Meter
sudo pip3 install ... は Raspberry Pi OS Bookworm(2023年以降)では “externally managed environment” エラーになる場合があります。仮想環境を使う手順が安全です。

CO2・温度をShared Memoryに書き出すスクリプト

ZabbixエージェントからCO2値を読み取れるよう、取得した値を /dev/shm/ 以下のファイルに継続的に書き出します。

from CO2Meter import *
import time

sensor = CO2Meter("/dev/hidraw0")  # 環境によって hidraw1 などになる場合があります

while True:
    time.sleep(1)
    data = sensor.get_data()
    if 'temperature' in data and 'co2' in data:
        with open('/dev/shm/co2', 'w') as f:
            f.write(str(data['co2']))
        with open('/dev/shm/temperature', 'w') as f:
            f.write(str(data['temperature']))
/dev/hidraw0 のデバイスパスは環境によって異なります。ls /dev/hidraw* で確認し、CO2-miniが認識されているパスを指定してください。

起動時に自動実行する(crontab)

rootでないとデバイスにアクセスできないため、root権限で起動するシェルスクリプトを作成します。

/root/co2.sh

#!/bin/bash
sleep 5
/root/co2env/bin/python3 /root/co2.py

crontabに追加して起動時に自動実行するよう設定します。

@reboot /root/co2.sh

Zabbixの設定

ZabbixからRaspberry Piのデータを収集するには、zabbix-serverとzabbix-agentの両方を設定する必要があります。

方針

  • Raspberry PiのShared Memory(/dev/shm/)にCO2値と温度を常時書き出す
  • Zabbixエージェントはそのファイルを cat して返す

zabbix-server側:ホストとアイテムの作成

Raspberry Piにzabbix-agentをインストールし、zabbix-serverでホストを追加します。

Zabbixのホスト作成画面。Raspberry PiのIPアドレスを指定してホストを追加している様子
Zabbixでホストを作成する

CO2濃度と温度の2つのアイテムを作成します。

ZabbixのアイテムリストにCO2濃度と温度の2つのアイテムが表示されている画面
CO2濃度と温度のアイテムを作成する

ZabbixのアイテムキーにUserParameter名(co2.co2 / co2.temp)を設定している設定画面
アイテムのキー設定(UserParameterと対応させる)

アイテムキーは以下にしました。

co2.co2   (CO2濃度)
co2.temp  (温度)

zabbix-agent側:設定ファイルの編集

/etc/zabbix/zabbix_agentd.conf でサーバーアドレスを指定します。

Server=<zabbix-serverのアドレス>
ServerActive=<zabbix-serverのアドレス>
Include=/etc/zabbix/zabbix_agentd.conf.d/*.conf

UserParameterの設定

/etc/zabbix/zabbix_agentd.conf.d/userparameter_co2.conf を作成します。Shared Memoryのファイルを cat して返すだけです。

UserParameter=co2.co2,cat /dev/shm/co2
UserParameter=co2.temp,cat /dev/shm/temperature

設定後、zabbix-agentを再起動します。

sudo systemctl restart zabbix-agent

動作結果

CO2濃度と温度をZabbixでグラフ化できました。

ZabbixのグラフにRaspberry Pi + CO2-miniで取得したCO2濃度のリアルタイムデータが折れ線グラフで表示されている
CO2濃度のZabbixグラフ。換気のタイミングで値が下がるのがわかる

Zabbixで数週間分のCO2濃度推移グラフ。冬季は窓を開けた後に急激にCO2が下がっている様子が見える
設置してからの長期推移。冬は換気すると室温も下がるため、CO2上昇を許容しがち

CO2モニターを導入してから、換気の頻度が体感でかなり上がりました。数値で見ると「換気が必要なタイミング」が一目瞭然です。

まとめ

構成要素役割
CO2-miniUSB接続でCO2濃度・温度を計測
Raspberry Piセンサーからデータを取得・Shared Memoryに保存
Python(CO2Meterライブラリ)CO2-miniとの通信・データ取得
Zabbix(agent + server)データの収集・グラフ化・長期記録

作成したスクリプト一式はGitHubで公開しています。

GitHub - yukishita/co2-mini:CUSTOM CO2-miniをZabbixで記録するプログラム

Tomokatsu Yukishita (雪下 智且)
Tomokatsu Yukishita (雪下 智且)
Engineering Manager / 宅地建物取引士

組み込み開発とクラウド/AI技術をつなぐEngineering Manager。ミッションクリティカル領域で培った品質基準を、現代的な開発プロセスに接続しています。

関連項目