見出し画像

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 などで定期的に実行するようにします。



この記事が気に入ったらサポートをしてみませんか?