室内の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}
が出力されていれば成功です。
その他のレスポンスについてはこちらから確認してみてください。
まとめ
このようにCO2濃度をグラフ化することで、1日の状況が一目でわかるようになりました。
Monitors
から監視ルールを追加し、換気が必要な数値になったらアラートで知らせるのもいいかもしれません。
USB経由で簡単にデータを取り出せるので、アイディア次第で色々遊べそうです。