仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

CO2濃度をMackerelで可視化する

室内のCO2濃度が高まると、眠気や頭痛など、人体に様々な影響があるようです。 CO2濃度を見える化し、快適な作業環境を整えるため、CO2モニターのEPEA-CO2-NDIR-07を導入してみました。 EPEA-CO2-NDIR-07はUSB経由でシリアル入力を読み取れるようなので、Linuxマシーンと接続し、Mackerelでグラフ化してみます。

検証環境

  • Ubuntu 20.04.3
  • EPEA-CO2-NDIR-07

Mackerelの準備

Mackerelにはホストの監視を行うホストメトリックと、自由にメトリクスの投稿が行えるサービスメトリックがあります。

https://support.mackerel.io/hc/ja/articles/900005516026-ホストメトリックとサービスメトリックの違いについて

今回ホストの監視は不要なので、サービスメトリックを使用します。

  • 左メニューのServicesからサービスの新規作成か、すでに他のサービスが追加されている場合は、サービスを追加するからサービスの追加を行ってください。
  • メトリクスの投稿にはAPIキーが必要になります。オーガニゼーションの詳細ページAPIキータブからAPIキーをメモしておきます。

Mackerelでグラフ化

下記のスクリプトを適当なパスに設置し、chmod +xで実行権限を付与してください。 変更が必要な変数にはコメントをつけてありますので、適所変更をお願いします。

#!/bin/bash

# EPEA-CO2-NDIR-07を接続した際、割り当てられた端末デバイスを指定
# dmesg -wなどで監視しながらUSB接続するとわかりやすいと思います。
device='/dev/ttyUSB0'

# `Mackerelの準備`でメモしておいたAPIキー
apikey='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

# `Mackerelの準備`で追加したサービス名
service_name='CO2Monitor'

# メトリクス名、お好みで変更してください。
# 複数の部屋を監視する場合はCO2.room1、CO2.room2、...
# 仲間内でそれぞれの家の状況を投稿し合うならCO2.tanaka、CO2.satoなど?
metrics_name='CO2.room1'

total=0 i=0 next=0

stty -F "$device" 115200 raw -echo
exec {fd}<"$device"

while read -u "$fd" -r line; do
    line=$(echo "$line" | tr -d '\r')
    if [[ ! "$line" =~ ^\{.+\}$ ]]; then
        continue
    fi

    n=$(echo "$line" | tr -d '{}' | cut -d: -f2)
    if [[ ! "$n" =~ ^[0-9]+$ ]]; then
        continue
    fi

    total=$(($total + $n))
    i=$(($i + 1))

    if [[ $(date +%s) -ge "$next" ]]; then
        value=$(echo "$total" "$i" | awk '{printf("%f", $1 / $2)}')

        # ここを変更すると、色々遊べそう
        curl -Ss -X POST \
             -H "X-Api-Key: $apikey" \
             -H 'Content-Type: application/json' \
             -d '[{"name": "'$metrics_name'", "time": '$(date +%s)', "value": '$value'}]' \
             "https://api.mackerelio.com/api/v0/services/$service_name/tsdb"
        echo

        total=0 i=0 next=$(date -d '1 minutes' +%s)
    fi
done

$deviceのオーナーがroot:dialout、パーミッションが660に設定されていると思います。 このスクリプトを実行するユーザーをgpasswd -a $USER dialoutで読み込み可能なグループに所属させてください。 グループの反映には、一度ログアウトが必要になります。再ログイン後groupsなどで、グループに所属できたか確認してみてください。

上記の設定を行なった後に、/dev/ttyUSB0: Permission deniedのようなエラーが出る場合は、スクリプトを管理者権限で動かしてしまってもいいかもしれません。

このスクリプトはMackerelのAPIレスポンスをそのまま出力しています。{"success":true}が出力されていれば成功です。 その他のレスポンスについてはこちらから確認してみてください。

まとめ

f:id:virtualtech:20211018161642p:plain

このようにCO2濃度をグラフ化することで、1日の状況が一目でわかるようになりました。 Monitorsから監視ルールを追加し、換気が必要な数値になったらアラートで知らせるのもいいかもしれません。

USB経由で簡単にデータを取り出せるので、アイディア次第で色々遊べそうです。