CO2 の値を MQTT で送信する
概要
ラズパイを使って、CUSTOM 社製の CO2 モニター (CO2-mini) から USB 経由で取得した値をMQTT ブローカーへパブリッシュします。
親デバイスはラズパイではなくても USB 給電できる Linux 機なら動作するはずです。
環境
Device : Raspberry Pi 3 Model B
OS : Raspberry Pi OS
Python : 3.9
CO2 Sensor : CO2-mini
CO2-mini
単体で動作する CO2 モニター。
正式にサポートされていませんが、有志によるリバースエンジニアリングによって USB 経由でデータを取得することが可能です。
自動キャリブレーション機能が付いているので、他のセンサーで必要なキャリブレーションは基本的に不要(キャリブレーションすることも可能)です。
設定
ライブラリのインストール
データ取得ライブラリ CO2Meter を作者の Github サイトからインストールします。
$ pip install git+https://github.com/heinemml/CO2Meter
パーミッションの設定
下記のルールファイルを作成します。
/etc/udev/rules.d/90-co2mini.rules
ACTION=="remove", GOTO="co2mini_end"
SUBSYSTEMS=="usb", KERNEL=="hidraw*", ATTRS{idVendor}=="04d9", ATTRS{idProduct}=="a052", MODE="0666", SYMLINK+="co2mini%n", GOTO="co2mini_end"
LABEL="co2mini_end"
上記ルールをシステムに反映。
$ sudo udevadm control --reload-rules
※ パーミッションの設定は必須ではありませんが、その場合の実行には
root 権限が必要となります。
※ ライブラリの説明では plugdev グループに権限を与えていますが、
どのユーザーでもアクセスできるように変更しています。
接続とテスト
ラズパイと CO2-mini を USB で接続。
以下のプログラムを実行し動作チェックをします。
from CO2Meter import *
import time
sensor = CO2Meter("/dev/hidraw0")
while True:
time.sleep(2)
print(sensor.get_data())
{'temperature': 26.5}
{'temperature': 26.5}
{'co2': 823, 'temperature': 26.5}
{'co2': 823, 'temperature': 26.6}
CO2 と温度の両方が取得できていれば OK。
最初は一方しか取得できない場合もありますが、最終的に両方取得できていれば問題ありません。
本プログラム
MQTT のパブリッシュには paho-mqtt ライブラリを使いますので、インストールしておきます。
$ pip install paho-mqtt
以下のコードを pub_co2.py として保存。
import time
import os
import json
from dotenv import load_dotenv
import paho.mqtt.publish as publish
from CO2Meter import *
load_dotenv()
MQTT_TOPIC = "*** MQTT Topic ***"
MQTT_BROKER = "*** MQTT Broker IP のアドレス ***"
sensor = CO2Meter("/dev/hidraw0")
time.sleep(5)
data=sensor.get_data()
print(data)
data = {'device': 'co2-mini', 'datatype': 'temp', \
'field': {'temp': data['temperature'], 'co2': data['co2']}}
print(data)
publish.single(MQTT_TOPIC, json.dumps(data), hostname=MQTT_BROKER)
cron などで定期的に実行するようにします。
この記事が気に入ったらサポートをしてみませんか?